From 8e21cfc0cfc4d8bc03f112422379d96edbf4d317 Mon Sep 17 00:00:00 2001 From: Adeodato Simo <dato@google.com> Date: Wed, 5 Jan 2011 11:56:49 +0000 Subject: [PATCH] query.py: add definitions for node group queries Signed-off-by: Adeodato Simo <dato@google.com> Reviewed-by: Michael Hanselmann <hansmi@google.com> --- lib/query.py | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/lib/query.py b/lib/query.py index 7906c6792..4afa42f90 100644 --- a/lib/query.py +++ b/lib/query.py @@ -46,6 +46,11 @@ from ganeti import ht LQ_OWNER, LQ_PENDING) = range(10, 13) +(GQ_CONFIG, + GQ_NODE, + GQ_INST) = range(200, 203) + + FIELD_NAME_RE = re.compile(r"^[a-z0-9/._]+$") TITLE_RE = re.compile(r"^[^\s]+$") @@ -1064,6 +1069,79 @@ def _BuildLockFields(): ]) +class GroupQueryData: + """Data container for node group data queries. + + """ + def __init__(self, groups, group_to_nodes, group_to_instances): + """Initializes this class. + + @param groups: List of node group objects + @type group_to_nodes: dict; group UUID as key + @param group_to_nodes: Per-group list of nodes + @type group_to_instances: dict; group UUID as key + @param group_to_instances: Per-group list of (primary) instances + + """ + self.groups = groups + self.group_to_nodes = group_to_nodes + self.group_to_instances = group_to_instances + + def __iter__(self): + """Iterate over all node groups. + + """ + return iter(self.groups) + + +_GROUP_SIMPLE_FIELDS = { + "alloc_policy": ("AllocPolicy", constants.QFT_TEXT), + "name": ("Group", constants.QFT_TEXT), + "serial_no": ("SerialNo", constants.QFT_NUMBER), + "uuid": ("UUID", constants.QFT_TEXT), + } + + +def _BuildGroupFields(): + """Builds list of fields for node group queries. + + """ + # Add simple fields + fields = [(_MakeField(name, title, kind), GQ_CONFIG, _GetItemAttr(name)) + for (name, (title, kind)) in _GROUP_SIMPLE_FIELDS.items()] + + def _GetLength(getter): + return lambda ctx, group: (constants.QRFS_NORMAL, + len(getter(ctx)[group.uuid])) + + def _GetSortedList(getter): + return lambda ctx, group: (constants.QRFS_NORMAL, + utils.NiceSort(getter(ctx)[group.uuid])) + + group_to_nodes = operator.attrgetter("group_to_nodes") + group_to_instances = operator.attrgetter("group_to_instances") + + # Add fields for nodes + fields.extend([ + (_MakeField("node_cnt", "Nodes", constants.QFT_NUMBER), + GQ_NODE, _GetLength(group_to_nodes)), + (_MakeField("node_list", "NodeList", constants.QFT_OTHER), + GQ_NODE, _GetSortedList(group_to_nodes)), + ]) + + # Add fields for instances + fields.extend([ + (_MakeField("pinst_cnt", "Instances", constants.QFT_NUMBER), + GQ_INST, _GetLength(group_to_instances)), + (_MakeField("pinst_list", "InstanceList", constants.QFT_OTHER), + GQ_INST, _GetSortedList(group_to_instances)), + ]) + + fields.extend(_GetItemTimestampFields(GQ_CONFIG)) + + return _PrepareFieldList(fields) + + #: Fields available for node queries NODE_FIELDS = _BuildNodeFields() @@ -1073,5 +1151,8 @@ INSTANCE_FIELDS = _BuildInstanceFields() #: Fields available for lock queries LOCK_FIELDS = _BuildLockFields() +#: Fields available for node group queries +GROUP_FIELDS = _BuildGroupFields() + #: All available field lists -ALL_FIELD_LISTS = [NODE_FIELDS, INSTANCE_FIELDS, LOCK_FIELDS] +ALL_FIELD_LISTS = [NODE_FIELDS, INSTANCE_FIELDS, LOCK_FIELDS, GROUP_FIELDS] -- GitLab