Statistics
| Branch: | Tag: | Revision:

root / lib / query.py @ dd94e9f6

History | View | Annotate | Download (28 kB)

1 4ca96421 Michael Hanselmann
#
2 4ca96421 Michael Hanselmann
#
3 4ca96421 Michael Hanselmann
4 4ca96421 Michael Hanselmann
# Copyright (C) 2010 Google Inc.
5 4ca96421 Michael Hanselmann
#
6 4ca96421 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 4ca96421 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 4ca96421 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 4ca96421 Michael Hanselmann
# (at your option) any later version.
10 4ca96421 Michael Hanselmann
#
11 4ca96421 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 4ca96421 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 4ca96421 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 4ca96421 Michael Hanselmann
# General Public License for more details.
15 4ca96421 Michael Hanselmann
#
16 4ca96421 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 4ca96421 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 4ca96421 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 4ca96421 Michael Hanselmann
# 02110-1301, USA.
20 4ca96421 Michael Hanselmann
21 4ca96421 Michael Hanselmann
22 4ca96421 Michael Hanselmann
"""Module for query operations"""
23 4ca96421 Michael Hanselmann
24 8235fe04 Michael Hanselmann
import logging
25 4ca96421 Michael Hanselmann
import operator
26 4ca96421 Michael Hanselmann
import re
27 4ca96421 Michael Hanselmann
28 4ca96421 Michael Hanselmann
from ganeti import constants
29 4ca96421 Michael Hanselmann
from ganeti import errors
30 4ca96421 Michael Hanselmann
from ganeti import utils
31 4ca96421 Michael Hanselmann
from ganeti import compat
32 4ca96421 Michael Hanselmann
from ganeti import objects
33 4ca96421 Michael Hanselmann
from ganeti import ht
34 4ca96421 Michael Hanselmann
35 4ca96421 Michael Hanselmann
36 8235fe04 Michael Hanselmann
(NQ_CONFIG,
37 8235fe04 Michael Hanselmann
 NQ_INST,
38 8235fe04 Michael Hanselmann
 NQ_LIVE,
39 8235fe04 Michael Hanselmann
 NQ_GROUP) = range(1, 5)
40 8235fe04 Michael Hanselmann
41 1c8addc6 Michael Hanselmann
(IQ_CONFIG,
42 1c8addc6 Michael Hanselmann
 IQ_LIVE,
43 1c8addc6 Michael Hanselmann
 IQ_DISKUSAGE) = range(100, 103)
44 1c8addc6 Michael Hanselmann
45 8235fe04 Michael Hanselmann
46 4ca96421 Michael Hanselmann
FIELD_NAME_RE = re.compile(r"^[a-z0-9/._]+$")
47 4ca96421 Michael Hanselmann
TITLE_RE = re.compile(r"^[^\s]+$")
48 4ca96421 Michael Hanselmann
49 4ca96421 Michael Hanselmann
#: Verification function for each field type
50 4ca96421 Michael Hanselmann
_VERIFY_FN = {
51 4ca96421 Michael Hanselmann
  constants.QFT_UNKNOWN: ht.TNone,
52 4ca96421 Michael Hanselmann
  constants.QFT_TEXT: ht.TString,
53 4ca96421 Michael Hanselmann
  constants.QFT_BOOL: ht.TBool,
54 4ca96421 Michael Hanselmann
  constants.QFT_NUMBER: ht.TInt,
55 4ca96421 Michael Hanselmann
  constants.QFT_UNIT: ht.TInt,
56 4ca96421 Michael Hanselmann
  constants.QFT_TIMESTAMP: ht.TOr(ht.TInt, ht.TFloat),
57 4ca96421 Michael Hanselmann
  constants.QFT_OTHER: lambda _: True,
58 4ca96421 Michael Hanselmann
  }
59 4ca96421 Michael Hanselmann
60 4ca96421 Michael Hanselmann
61 4ca96421 Michael Hanselmann
def _GetUnknownField(ctx, item): # pylint: disable-msg=W0613
62 4ca96421 Michael Hanselmann
  """Gets the contents of an unknown field.
63 4ca96421 Michael Hanselmann

64 4ca96421 Michael Hanselmann
  """
65 4ca96421 Michael Hanselmann
  return (constants.QRFS_UNKNOWN, None)
66 4ca96421 Michael Hanselmann
67 4ca96421 Michael Hanselmann
68 4ca96421 Michael Hanselmann
def _GetQueryFields(fielddefs, selected):
69 4ca96421 Michael Hanselmann
  """Calculates the internal list of selected fields.
70 4ca96421 Michael Hanselmann

71 4ca96421 Michael Hanselmann
  Unknown fields are returned as L{constants.QFT_UNKNOWN}.
72 4ca96421 Michael Hanselmann

73 4ca96421 Michael Hanselmann
  @type fielddefs: dict
74 4ca96421 Michael Hanselmann
  @param fielddefs: Field definitions
75 4ca96421 Michael Hanselmann
  @type selected: list of strings
76 4ca96421 Michael Hanselmann
  @param selected: List of selected fields
77 4ca96421 Michael Hanselmann

78 4ca96421 Michael Hanselmann
  """
79 4ca96421 Michael Hanselmann
  result = []
80 4ca96421 Michael Hanselmann
81 4ca96421 Michael Hanselmann
  for name in selected:
82 4ca96421 Michael Hanselmann
    try:
83 4ca96421 Michael Hanselmann
      fdef = fielddefs[name]
84 4ca96421 Michael Hanselmann
    except KeyError:
85 4ca96421 Michael Hanselmann
      fdef = (_MakeField(name, name, constants.QFT_UNKNOWN),
86 4ca96421 Michael Hanselmann
              None, _GetUnknownField)
87 4ca96421 Michael Hanselmann
88 4ca96421 Michael Hanselmann
    assert len(fdef) == 3
89 4ca96421 Michael Hanselmann
90 4ca96421 Michael Hanselmann
    result.append(fdef)
91 4ca96421 Michael Hanselmann
92 4ca96421 Michael Hanselmann
  return result
93 4ca96421 Michael Hanselmann
94 4ca96421 Michael Hanselmann
95 4ca96421 Michael Hanselmann
def GetAllFields(fielddefs):
96 4ca96421 Michael Hanselmann
  """Extract L{objects.QueryFieldDefinition} from field definitions.
97 4ca96421 Michael Hanselmann

98 4ca96421 Michael Hanselmann
  @rtype: list of L{objects.QueryFieldDefinition}
99 4ca96421 Michael Hanselmann

100 4ca96421 Michael Hanselmann
  """
101 4ca96421 Michael Hanselmann
  return [fdef for (fdef, _, _) in fielddefs]
102 4ca96421 Michael Hanselmann
103 4ca96421 Michael Hanselmann
104 4ca96421 Michael Hanselmann
class Query:
105 4ca96421 Michael Hanselmann
  def __init__(self, fieldlist, selected):
106 4ca96421 Michael Hanselmann
    """Initializes this class.
107 4ca96421 Michael Hanselmann

108 4ca96421 Michael Hanselmann
    The field definition is a dictionary with the field's name as a key and a
109 4ca96421 Michael Hanselmann
    tuple containing, in order, the field definition object
110 4ca96421 Michael Hanselmann
    (L{objects.QueryFieldDefinition}, the data kind to help calling code
111 4ca96421 Michael Hanselmann
    collect data and a retrieval function. The retrieval function is called
112 4ca96421 Michael Hanselmann
    with two parameters, in order, the data container and the item in container
113 4ca96421 Michael Hanselmann
    (see L{Query.Query}).
114 4ca96421 Michael Hanselmann

115 4ca96421 Michael Hanselmann
    Users of this class can call L{RequestedData} before preparing the data
116 4ca96421 Michael Hanselmann
    container to determine what data is needed.
117 4ca96421 Michael Hanselmann

118 4ca96421 Michael Hanselmann
    @type fieldlist: dictionary
119 4ca96421 Michael Hanselmann
    @param fieldlist: Field definitions
120 4ca96421 Michael Hanselmann
    @type selected: list of strings
121 4ca96421 Michael Hanselmann
    @param selected: List of selected fields
122 4ca96421 Michael Hanselmann

123 4ca96421 Michael Hanselmann
    """
124 4ca96421 Michael Hanselmann
    self._fields = _GetQueryFields(fieldlist, selected)
125 4ca96421 Michael Hanselmann
126 4ca96421 Michael Hanselmann
  def RequestedData(self):
127 4ca96421 Michael Hanselmann
    """Gets requested kinds of data.
128 4ca96421 Michael Hanselmann

129 4ca96421 Michael Hanselmann
    @rtype: frozenset
130 4ca96421 Michael Hanselmann

131 4ca96421 Michael Hanselmann
    """
132 4ca96421 Michael Hanselmann
    return frozenset(datakind
133 4ca96421 Michael Hanselmann
                     for (_, datakind, _) in self._fields
134 4ca96421 Michael Hanselmann
                     if datakind is not None)
135 4ca96421 Michael Hanselmann
136 4ca96421 Michael Hanselmann
  def GetFields(self):
137 4ca96421 Michael Hanselmann
    """Returns the list of fields for this query.
138 4ca96421 Michael Hanselmann

139 4ca96421 Michael Hanselmann
    Includes unknown fields.
140 4ca96421 Michael Hanselmann

141 4ca96421 Michael Hanselmann
    @rtype: List of L{objects.QueryFieldDefinition}
142 4ca96421 Michael Hanselmann

143 4ca96421 Michael Hanselmann
    """
144 4ca96421 Michael Hanselmann
    return GetAllFields(self._fields)
145 4ca96421 Michael Hanselmann
146 4ca96421 Michael Hanselmann
  def Query(self, ctx):
147 4ca96421 Michael Hanselmann
    """Execute a query.
148 4ca96421 Michael Hanselmann

149 4ca96421 Michael Hanselmann
    @param ctx: Data container passed to field retrieval functions, must
150 4ca96421 Michael Hanselmann
      support iteration using C{__iter__}
151 4ca96421 Michael Hanselmann

152 4ca96421 Michael Hanselmann
    """
153 4ca96421 Michael Hanselmann
    result = [[fn(ctx, item) for (_, _, fn) in self._fields]
154 4ca96421 Michael Hanselmann
              for item in ctx]
155 4ca96421 Michael Hanselmann
156 4ca96421 Michael Hanselmann
    # Verify result
157 4ca96421 Michael Hanselmann
    if __debug__:
158 4ca96421 Michael Hanselmann
      for (idx, row) in enumerate(result):
159 4ca96421 Michael Hanselmann
        assert _VerifyResultRow(self._fields, row), \
160 4ca96421 Michael Hanselmann
               ("Inconsistent result for fields %s in row %s: %r" %
161 89ce4acc Michael Hanselmann
                (GetAllFields(self._fields), idx, row))
162 4ca96421 Michael Hanselmann
163 4ca96421 Michael Hanselmann
    return result
164 4ca96421 Michael Hanselmann
165 4ca96421 Michael Hanselmann
  def OldStyleQuery(self, ctx):
166 4ca96421 Michael Hanselmann
    """Query with "old" query result format.
167 4ca96421 Michael Hanselmann

168 4ca96421 Michael Hanselmann
    See L{Query.Query} for arguments.
169 4ca96421 Michael Hanselmann

170 4ca96421 Michael Hanselmann
    """
171 4ca96421 Michael Hanselmann
    unknown = set(fdef.name
172 4ca96421 Michael Hanselmann
                  for (fdef, _, _) in self._fields
173 4ca96421 Michael Hanselmann
                  if fdef.kind == constants.QFT_UNKNOWN)
174 4ca96421 Michael Hanselmann
    if unknown:
175 4ca96421 Michael Hanselmann
      raise errors.OpPrereqError("Unknown output fields selected: %s" %
176 4ca96421 Michael Hanselmann
                                 (utils.CommaJoin(unknown), ),
177 4ca96421 Michael Hanselmann
                                 errors.ECODE_INVAL)
178 4ca96421 Michael Hanselmann
179 4ca96421 Michael Hanselmann
    return [[value for (_, value) in row]
180 4ca96421 Michael Hanselmann
            for row in self.Query(ctx)]
181 4ca96421 Michael Hanselmann
182 4ca96421 Michael Hanselmann
183 4ca96421 Michael Hanselmann
def _VerifyResultRow(fields, row):
184 4ca96421 Michael Hanselmann
  """Verifies the contents of a query result row.
185 4ca96421 Michael Hanselmann

186 4ca96421 Michael Hanselmann
  @type fields: list
187 4ca96421 Michael Hanselmann
  @param fields: Field definitions for result
188 4ca96421 Michael Hanselmann
  @type row: list of tuples
189 4ca96421 Michael Hanselmann
  @param row: Row data
190 4ca96421 Michael Hanselmann

191 4ca96421 Michael Hanselmann
  """
192 4ca96421 Michael Hanselmann
  return (len(row) == len(fields) and
193 4ca96421 Michael Hanselmann
          compat.all((status == constants.QRFS_NORMAL and
194 4ca96421 Michael Hanselmann
                      _VERIFY_FN[fdef.kind](value)) or
195 4ca96421 Michael Hanselmann
                     # Value for an abnormal status must be None
196 4ca96421 Michael Hanselmann
                     (status != constants.QRFS_NORMAL and value is None)
197 4ca96421 Michael Hanselmann
                     for ((status, value), (fdef, _, _)) in zip(row, fields)))
198 4ca96421 Michael Hanselmann
199 4ca96421 Michael Hanselmann
200 4ca96421 Michael Hanselmann
def _PrepareFieldList(fields):
201 4ca96421 Michael Hanselmann
  """Prepares field list for use by L{Query}.
202 4ca96421 Michael Hanselmann

203 4ca96421 Michael Hanselmann
  Converts the list to a dictionary and does some verification.
204 4ca96421 Michael Hanselmann

205 4ca96421 Michael Hanselmann
  @type fields: list of tuples; (L{objects.QueryFieldDefinition}, data kind,
206 4ca96421 Michael Hanselmann
    retrieval function)
207 4ca96421 Michael Hanselmann
  @param fields: List of fields
208 4ca96421 Michael Hanselmann
  @rtype: dict
209 4ca96421 Michael Hanselmann
  @return: Field dictionary for L{Query}
210 4ca96421 Michael Hanselmann

211 4ca96421 Michael Hanselmann
  """
212 89ce4acc Michael Hanselmann
  if __debug__:
213 89ce4acc Michael Hanselmann
    duplicates = utils.FindDuplicates(fdef.title.lower()
214 89ce4acc Michael Hanselmann
                                      for (fdef, _, _) in fields)
215 89ce4acc Michael Hanselmann
    assert not duplicates, "Duplicate title(s) found: %r" % duplicates
216 4ca96421 Michael Hanselmann
217 4ca96421 Michael Hanselmann
  result = {}
218 4ca96421 Michael Hanselmann
219 4ca96421 Michael Hanselmann
  for field in fields:
220 4ca96421 Michael Hanselmann
    (fdef, _, fn) = field
221 4ca96421 Michael Hanselmann
222 4ca96421 Michael Hanselmann
    assert fdef.name and fdef.title, "Name and title are required"
223 4ca96421 Michael Hanselmann
    assert FIELD_NAME_RE.match(fdef.name)
224 4ca96421 Michael Hanselmann
    assert TITLE_RE.match(fdef.title)
225 4ca96421 Michael Hanselmann
    assert callable(fn)
226 89ce4acc Michael Hanselmann
    assert fdef.name not in result, \
227 89ce4acc Michael Hanselmann
           "Duplicate field name '%s' found" % fdef.name
228 4ca96421 Michael Hanselmann
229 4ca96421 Michael Hanselmann
    result[fdef.name] = field
230 4ca96421 Michael Hanselmann
231 4ca96421 Michael Hanselmann
  assert len(result) == len(fields)
232 4ca96421 Michael Hanselmann
  assert compat.all(name == fdef.name
233 4ca96421 Michael Hanselmann
                    for (name, (fdef, _, _)) in result.items())
234 4ca96421 Michael Hanselmann
235 4ca96421 Michael Hanselmann
  return result
236 4ca96421 Michael Hanselmann
237 4ca96421 Michael Hanselmann
238 4ca96421 Michael Hanselmann
def _MakeField(name, title, kind):
239 4ca96421 Michael Hanselmann
  """Wrapper for creating L{objects.QueryFieldDefinition} instances.
240 4ca96421 Michael Hanselmann

241 4ca96421 Michael Hanselmann
  @param name: Field name as a regular expression
242 4ca96421 Michael Hanselmann
  @param title: Human-readable title
243 4ca96421 Michael Hanselmann
  @param kind: Field type
244 4ca96421 Michael Hanselmann

245 4ca96421 Michael Hanselmann
  """
246 4ca96421 Michael Hanselmann
  return objects.QueryFieldDefinition(name=name, title=title, kind=kind)
247 8235fe04 Michael Hanselmann
248 8235fe04 Michael Hanselmann
249 8235fe04 Michael Hanselmann
def _GetNodeRole(node, master_name):
250 8235fe04 Michael Hanselmann
  """Determine node role.
251 8235fe04 Michael Hanselmann

252 8235fe04 Michael Hanselmann
  @type node: L{objects.Node}
253 8235fe04 Michael Hanselmann
  @param node: Node object
254 8235fe04 Michael Hanselmann
  @type master_name: string
255 8235fe04 Michael Hanselmann
  @param master_name: Master node name
256 8235fe04 Michael Hanselmann

257 8235fe04 Michael Hanselmann
  """
258 8235fe04 Michael Hanselmann
  if node.name == master_name:
259 8235fe04 Michael Hanselmann
    return "M"
260 8235fe04 Michael Hanselmann
  elif node.master_candidate:
261 8235fe04 Michael Hanselmann
    return "C"
262 8235fe04 Michael Hanselmann
  elif node.drained:
263 8235fe04 Michael Hanselmann
    return "D"
264 8235fe04 Michael Hanselmann
  elif node.offline:
265 8235fe04 Michael Hanselmann
    return "O"
266 8235fe04 Michael Hanselmann
  else:
267 8235fe04 Michael Hanselmann
    return "R"
268 8235fe04 Michael Hanselmann
269 8235fe04 Michael Hanselmann
270 8235fe04 Michael Hanselmann
def _GetItemAttr(attr):
271 8235fe04 Michael Hanselmann
  """Returns a field function to return an attribute of the item.
272 8235fe04 Michael Hanselmann

273 8235fe04 Michael Hanselmann
  @param attr: Attribute name
274 8235fe04 Michael Hanselmann

275 8235fe04 Michael Hanselmann
  """
276 8235fe04 Michael Hanselmann
  getter = operator.attrgetter(attr)
277 8235fe04 Michael Hanselmann
  return lambda _, item: (constants.QRFS_NORMAL, getter(item))
278 8235fe04 Michael Hanselmann
279 8235fe04 Michael Hanselmann
280 145bea54 Michael Hanselmann
def _GetItemTimestamp(getter):
281 145bea54 Michael Hanselmann
  """Returns function for getting timestamp of item.
282 145bea54 Michael Hanselmann

283 145bea54 Michael Hanselmann
  @type getter: callable
284 145bea54 Michael Hanselmann
  @param getter: Function to retrieve timestamp attribute
285 145bea54 Michael Hanselmann

286 145bea54 Michael Hanselmann
  """
287 145bea54 Michael Hanselmann
  def fn(_, item):
288 145bea54 Michael Hanselmann
    """Returns a timestamp of item.
289 145bea54 Michael Hanselmann

290 145bea54 Michael Hanselmann
    """
291 145bea54 Michael Hanselmann
    timestamp = getter(item)
292 145bea54 Michael Hanselmann
    if timestamp is None:
293 145bea54 Michael Hanselmann
      # Old configs might not have all timestamps
294 145bea54 Michael Hanselmann
      return (constants.QRFS_UNAVAIL, None)
295 145bea54 Michael Hanselmann
    else:
296 145bea54 Michael Hanselmann
      return (constants.QRFS_NORMAL, timestamp)
297 145bea54 Michael Hanselmann
298 145bea54 Michael Hanselmann
  return fn
299 145bea54 Michael Hanselmann
300 145bea54 Michael Hanselmann
301 145bea54 Michael Hanselmann
def _GetItemTimestampFields(datatype):
302 145bea54 Michael Hanselmann
  """Returns common timestamp fields.
303 145bea54 Michael Hanselmann

304 145bea54 Michael Hanselmann
  @param datatype: Field data type for use by L{Query.RequestedData}
305 145bea54 Michael Hanselmann

306 145bea54 Michael Hanselmann
  """
307 145bea54 Michael Hanselmann
  return [
308 145bea54 Michael Hanselmann
    (_MakeField("ctime", "CTime", constants.QFT_TIMESTAMP), datatype,
309 145bea54 Michael Hanselmann
     _GetItemTimestamp(operator.attrgetter("ctime"))),
310 145bea54 Michael Hanselmann
    (_MakeField("mtime", "MTime", constants.QFT_TIMESTAMP), datatype,
311 145bea54 Michael Hanselmann
     _GetItemTimestamp(operator.attrgetter("mtime"))),
312 145bea54 Michael Hanselmann
    ]
313 145bea54 Michael Hanselmann
314 145bea54 Michael Hanselmann
315 8235fe04 Michael Hanselmann
class NodeQueryData:
316 8235fe04 Michael Hanselmann
  """Data container for node data queries.
317 8235fe04 Michael Hanselmann

318 8235fe04 Michael Hanselmann
  """
319 8235fe04 Michael Hanselmann
  def __init__(self, nodes, live_data, master_name, node_to_primary,
320 8235fe04 Michael Hanselmann
               node_to_secondary, groups):
321 8235fe04 Michael Hanselmann
    """Initializes this class.
322 8235fe04 Michael Hanselmann

323 8235fe04 Michael Hanselmann
    """
324 8235fe04 Michael Hanselmann
    self.nodes = nodes
325 8235fe04 Michael Hanselmann
    self.live_data = live_data
326 8235fe04 Michael Hanselmann
    self.master_name = master_name
327 8235fe04 Michael Hanselmann
    self.node_to_primary = node_to_primary
328 8235fe04 Michael Hanselmann
    self.node_to_secondary = node_to_secondary
329 8235fe04 Michael Hanselmann
    self.groups = groups
330 8235fe04 Michael Hanselmann
331 8235fe04 Michael Hanselmann
    # Used for individual rows
332 8235fe04 Michael Hanselmann
    self.curlive_data = None
333 8235fe04 Michael Hanselmann
334 8235fe04 Michael Hanselmann
  def __iter__(self):
335 8235fe04 Michael Hanselmann
    """Iterate over all nodes.
336 8235fe04 Michael Hanselmann

337 8235fe04 Michael Hanselmann
    This function has side-effects and only one instance of the resulting
338 8235fe04 Michael Hanselmann
    generator should be used at a time.
339 8235fe04 Michael Hanselmann

340 8235fe04 Michael Hanselmann
    """
341 8235fe04 Michael Hanselmann
    for node in self.nodes:
342 8235fe04 Michael Hanselmann
      if self.live_data:
343 8235fe04 Michael Hanselmann
        self.curlive_data = self.live_data.get(node.name, None)
344 8235fe04 Michael Hanselmann
      else:
345 8235fe04 Michael Hanselmann
        self.curlive_data = None
346 8235fe04 Michael Hanselmann
      yield node
347 8235fe04 Michael Hanselmann
348 8235fe04 Michael Hanselmann
349 8235fe04 Michael Hanselmann
#: Fields that are direct attributes of an L{objects.Node} object
350 8235fe04 Michael Hanselmann
_NODE_SIMPLE_FIELDS = {
351 8235fe04 Michael Hanselmann
  "drained": ("Drained", constants.QFT_BOOL),
352 8235fe04 Michael Hanselmann
  "master_candidate": ("MasterC", constants.QFT_BOOL),
353 8235fe04 Michael Hanselmann
  "master_capable": ("MasterCapable", constants.QFT_BOOL),
354 8235fe04 Michael Hanselmann
  "name": ("Node", constants.QFT_TEXT),
355 8235fe04 Michael Hanselmann
  "offline": ("Offline", constants.QFT_BOOL),
356 8235fe04 Michael Hanselmann
  "serial_no": ("SerialNo", constants.QFT_NUMBER),
357 8235fe04 Michael Hanselmann
  "uuid": ("UUID", constants.QFT_TEXT),
358 8235fe04 Michael Hanselmann
  "vm_capable": ("VMCapable", constants.QFT_BOOL),
359 8235fe04 Michael Hanselmann
  }
360 8235fe04 Michael Hanselmann
361 8235fe04 Michael Hanselmann
362 8235fe04 Michael Hanselmann
#: Fields requiring talking to the node
363 8235fe04 Michael Hanselmann
_NODE_LIVE_FIELDS = {
364 8235fe04 Michael Hanselmann
  "bootid": ("BootID", constants.QFT_TEXT, "bootid"),
365 8235fe04 Michael Hanselmann
  "cnodes": ("CNodes", constants.QFT_NUMBER, "cpu_nodes"),
366 8235fe04 Michael Hanselmann
  "csockets": ("CSockets", constants.QFT_NUMBER, "cpu_sockets"),
367 8235fe04 Michael Hanselmann
  "ctotal": ("CTotal", constants.QFT_NUMBER, "cpu_total"),
368 8235fe04 Michael Hanselmann
  "dfree": ("DFree", constants.QFT_UNIT, "vg_free"),
369 8235fe04 Michael Hanselmann
  "dtotal": ("DTotal", constants.QFT_UNIT, "vg_size"),
370 8235fe04 Michael Hanselmann
  "mfree": ("MFree", constants.QFT_UNIT, "memory_free"),
371 8235fe04 Michael Hanselmann
  "mnode": ("MNode", constants.QFT_UNIT, "memory_dom0"),
372 8235fe04 Michael Hanselmann
  "mtotal": ("MTotal", constants.QFT_UNIT, "memory_total"),
373 8235fe04 Michael Hanselmann
  }
374 8235fe04 Michael Hanselmann
375 8235fe04 Michael Hanselmann
376 8235fe04 Michael Hanselmann
def _GetNodeGroup(ctx, node):
377 8235fe04 Michael Hanselmann
  """Returns the name of a node's group.
378 8235fe04 Michael Hanselmann

379 8235fe04 Michael Hanselmann
  @type ctx: L{NodeQueryData}
380 8235fe04 Michael Hanselmann
  @type node: L{objects.Node}
381 8235fe04 Michael Hanselmann
  @param node: Node object
382 8235fe04 Michael Hanselmann

383 8235fe04 Michael Hanselmann
  """
384 8235fe04 Michael Hanselmann
  ng = ctx.groups.get(node.group, None)
385 8235fe04 Michael Hanselmann
  if ng is None:
386 8235fe04 Michael Hanselmann
    # Nodes always have a group, or the configuration is corrupt
387 8235fe04 Michael Hanselmann
    return (constants.QRFS_UNAVAIL, None)
388 8235fe04 Michael Hanselmann
389 8235fe04 Michael Hanselmann
  return (constants.QRFS_NORMAL, ng.name)
390 8235fe04 Michael Hanselmann
391 8235fe04 Michael Hanselmann
392 8235fe04 Michael Hanselmann
def _GetLiveNodeField(field, kind, ctx, _):
393 8235fe04 Michael Hanselmann
  """Gets the value of a "live" field from L{NodeQueryData}.
394 8235fe04 Michael Hanselmann

395 8235fe04 Michael Hanselmann
  @param field: Live field name
396 8235fe04 Michael Hanselmann
  @param kind: Data kind, one of L{constants.QFT_ALL}
397 8235fe04 Michael Hanselmann
  @type ctx: L{NodeQueryData}
398 8235fe04 Michael Hanselmann

399 8235fe04 Michael Hanselmann
  """
400 8235fe04 Michael Hanselmann
  if not ctx.curlive_data:
401 8235fe04 Michael Hanselmann
    return (constants.QRFS_NODATA, None)
402 8235fe04 Michael Hanselmann
403 8235fe04 Michael Hanselmann
  try:
404 8235fe04 Michael Hanselmann
    value = ctx.curlive_data[field]
405 8235fe04 Michael Hanselmann
  except KeyError:
406 8235fe04 Michael Hanselmann
    return (constants.QRFS_UNAVAIL, None)
407 8235fe04 Michael Hanselmann
408 8235fe04 Michael Hanselmann
  if kind == constants.QFT_TEXT:
409 8235fe04 Michael Hanselmann
    return (constants.QRFS_NORMAL, value)
410 8235fe04 Michael Hanselmann
411 8235fe04 Michael Hanselmann
  assert kind in (constants.QFT_NUMBER, constants.QFT_UNIT)
412 8235fe04 Michael Hanselmann
413 8235fe04 Michael Hanselmann
  # Try to convert into number
414 8235fe04 Michael Hanselmann
  try:
415 8235fe04 Michael Hanselmann
    return (constants.QRFS_NORMAL, int(value))
416 8235fe04 Michael Hanselmann
  except (ValueError, TypeError):
417 8235fe04 Michael Hanselmann
    logging.exception("Failed to convert node field '%s' (value %r) to int",
418 8235fe04 Michael Hanselmann
                      value, field)
419 8235fe04 Michael Hanselmann
    return (constants.QRFS_UNAVAIL, None)
420 8235fe04 Michael Hanselmann
421 8235fe04 Michael Hanselmann
422 8235fe04 Michael Hanselmann
def _BuildNodeFields():
423 8235fe04 Michael Hanselmann
  """Builds list of fields for node queries.
424 8235fe04 Michael Hanselmann

425 8235fe04 Michael Hanselmann
  """
426 8235fe04 Michael Hanselmann
  fields = [
427 8235fe04 Michael Hanselmann
    (_MakeField("pip", "PrimaryIP", constants.QFT_TEXT), NQ_CONFIG,
428 8235fe04 Michael Hanselmann
     lambda ctx, node: (constants.QRFS_NORMAL, node.primary_ip)),
429 8235fe04 Michael Hanselmann
    (_MakeField("sip", "SecondaryIP", constants.QFT_TEXT), NQ_CONFIG,
430 8235fe04 Michael Hanselmann
     lambda ctx, node: (constants.QRFS_NORMAL, node.secondary_ip)),
431 8235fe04 Michael Hanselmann
    (_MakeField("tags", "Tags", constants.QFT_OTHER), NQ_CONFIG,
432 8235fe04 Michael Hanselmann
     lambda ctx, node: (constants.QRFS_NORMAL, list(node.GetTags()))),
433 8235fe04 Michael Hanselmann
    (_MakeField("master", "IsMaster", constants.QFT_BOOL), NQ_CONFIG,
434 8235fe04 Michael Hanselmann
     lambda ctx, node: (constants.QRFS_NORMAL, node.name == ctx.master_name)),
435 8235fe04 Michael Hanselmann
    (_MakeField("role", "Role", constants.QFT_TEXT), NQ_CONFIG,
436 8235fe04 Michael Hanselmann
     lambda ctx, node: (constants.QRFS_NORMAL,
437 8235fe04 Michael Hanselmann
                        _GetNodeRole(node, ctx.master_name))),
438 8235fe04 Michael Hanselmann
    (_MakeField("group", "Group", constants.QFT_TEXT), NQ_GROUP, _GetNodeGroup),
439 8235fe04 Michael Hanselmann
    (_MakeField("group.uuid", "GroupUUID", constants.QFT_TEXT),
440 8235fe04 Michael Hanselmann
     NQ_CONFIG, lambda ctx, node: (constants.QRFS_NORMAL, node.group)),
441 8235fe04 Michael Hanselmann
    ]
442 8235fe04 Michael Hanselmann
443 8235fe04 Michael Hanselmann
  def _GetLength(getter):
444 8235fe04 Michael Hanselmann
    return lambda ctx, node: (constants.QRFS_NORMAL,
445 8235fe04 Michael Hanselmann
                              len(getter(ctx)[node.name]))
446 8235fe04 Michael Hanselmann
447 8235fe04 Michael Hanselmann
  def _GetList(getter):
448 8235fe04 Michael Hanselmann
    return lambda ctx, node: (constants.QRFS_NORMAL,
449 8235fe04 Michael Hanselmann
                              list(getter(ctx)[node.name]))
450 8235fe04 Michael Hanselmann
451 8235fe04 Michael Hanselmann
  # Add fields operating on instance lists
452 8235fe04 Michael Hanselmann
  for prefix, titleprefix, getter in \
453 8235fe04 Michael Hanselmann
      [("p", "Pri", operator.attrgetter("node_to_primary")),
454 8235fe04 Michael Hanselmann
       ("s", "Sec", operator.attrgetter("node_to_secondary"))]:
455 8235fe04 Michael Hanselmann
    fields.extend([
456 8235fe04 Michael Hanselmann
      (_MakeField("%sinst_cnt" % prefix, "%sinst" % prefix.upper(),
457 8235fe04 Michael Hanselmann
                  constants.QFT_NUMBER),
458 8235fe04 Michael Hanselmann
       NQ_INST, _GetLength(getter)),
459 8235fe04 Michael Hanselmann
      (_MakeField("%sinst_list" % prefix, "%sInstances" % titleprefix,
460 8235fe04 Michael Hanselmann
                  constants.QFT_OTHER),
461 8235fe04 Michael Hanselmann
       NQ_INST, _GetList(getter)),
462 8235fe04 Michael Hanselmann
      ])
463 8235fe04 Michael Hanselmann
464 8235fe04 Michael Hanselmann
  # Add simple fields
465 8235fe04 Michael Hanselmann
  fields.extend([(_MakeField(name, title, kind), NQ_CONFIG, _GetItemAttr(name))
466 8235fe04 Michael Hanselmann
                 for (name, (title, kind)) in _NODE_SIMPLE_FIELDS.items()])
467 8235fe04 Michael Hanselmann
468 8235fe04 Michael Hanselmann
  # Add fields requiring live data
469 8235fe04 Michael Hanselmann
  fields.extend([
470 8235fe04 Michael Hanselmann
    (_MakeField(name, title, kind), NQ_LIVE,
471 8235fe04 Michael Hanselmann
     compat.partial(_GetLiveNodeField, nfield, kind))
472 8235fe04 Michael Hanselmann
    for (name, (title, kind, nfield)) in _NODE_LIVE_FIELDS.items()
473 8235fe04 Michael Hanselmann
    ])
474 8235fe04 Michael Hanselmann
475 145bea54 Michael Hanselmann
  # Add timestamps
476 145bea54 Michael Hanselmann
  fields.extend(_GetItemTimestampFields(NQ_CONFIG))
477 145bea54 Michael Hanselmann
478 8235fe04 Michael Hanselmann
  return _PrepareFieldList(fields)
479 8235fe04 Michael Hanselmann
480 8235fe04 Michael Hanselmann
481 1c8addc6 Michael Hanselmann
class InstanceQueryData:
482 1c8addc6 Michael Hanselmann
  """Data container for instance data queries.
483 1c8addc6 Michael Hanselmann

484 1c8addc6 Michael Hanselmann
  """
485 1c8addc6 Michael Hanselmann
  def __init__(self, instances, cluster, disk_usage, offline_nodes, bad_nodes,
486 1c8addc6 Michael Hanselmann
               live_data):
487 1c8addc6 Michael Hanselmann
    """Initializes this class.
488 1c8addc6 Michael Hanselmann

489 1c8addc6 Michael Hanselmann
    @param instances: List of instance objects
490 1c8addc6 Michael Hanselmann
    @param cluster: Cluster object
491 1c8addc6 Michael Hanselmann
    @type disk_usage: dict; instance name as key
492 1c8addc6 Michael Hanselmann
    @param disk_usage: Per-instance disk usage
493 1c8addc6 Michael Hanselmann
    @type offline_nodes: list of strings
494 1c8addc6 Michael Hanselmann
    @param offline_nodes: List of offline nodes
495 1c8addc6 Michael Hanselmann
    @type bad_nodes: list of strings
496 1c8addc6 Michael Hanselmann
    @param bad_nodes: List of faulty nodes
497 1c8addc6 Michael Hanselmann
    @type live_data: dict; instance name as key
498 1c8addc6 Michael Hanselmann
    @param live_data: Per-instance live data
499 1c8addc6 Michael Hanselmann

500 1c8addc6 Michael Hanselmann
    """
501 1c8addc6 Michael Hanselmann
    assert len(set(bad_nodes) & set(offline_nodes)) == len(offline_nodes), \
502 1c8addc6 Michael Hanselmann
           "Offline nodes not included in bad nodes"
503 1c8addc6 Michael Hanselmann
    assert not (set(live_data.keys()) & set(bad_nodes)), \
504 1c8addc6 Michael Hanselmann
           "Found live data for bad or offline nodes"
505 1c8addc6 Michael Hanselmann
506 1c8addc6 Michael Hanselmann
    self.instances = instances
507 1c8addc6 Michael Hanselmann
    self.cluster = cluster
508 1c8addc6 Michael Hanselmann
    self.disk_usage = disk_usage
509 1c8addc6 Michael Hanselmann
    self.offline_nodes = offline_nodes
510 1c8addc6 Michael Hanselmann
    self.bad_nodes = bad_nodes
511 1c8addc6 Michael Hanselmann
    self.live_data = live_data
512 1c8addc6 Michael Hanselmann
513 1c8addc6 Michael Hanselmann
    # Used for individual rows
514 1c8addc6 Michael Hanselmann
    self.inst_hvparams = None
515 1c8addc6 Michael Hanselmann
    self.inst_beparams = None
516 1c8addc6 Michael Hanselmann
    self.inst_nicparams = None
517 1c8addc6 Michael Hanselmann
518 1c8addc6 Michael Hanselmann
  def __iter__(self):
519 1c8addc6 Michael Hanselmann
    """Iterate over all instances.
520 1c8addc6 Michael Hanselmann

521 1c8addc6 Michael Hanselmann
    This function has side-effects and only one instance of the resulting
522 1c8addc6 Michael Hanselmann
    generator should be used at a time.
523 1c8addc6 Michael Hanselmann

524 1c8addc6 Michael Hanselmann
    """
525 1c8addc6 Michael Hanselmann
    for inst in self.instances:
526 1c8addc6 Michael Hanselmann
      self.inst_hvparams = self.cluster.FillHV(inst, skip_globals=True)
527 1c8addc6 Michael Hanselmann
      self.inst_beparams = self.cluster.FillBE(inst)
528 1c8addc6 Michael Hanselmann
      self.inst_nicparams = [self.cluster.SimpleFillNIC(nic.nicparams)
529 1c8addc6 Michael Hanselmann
                             for nic in inst.nics]
530 1c8addc6 Michael Hanselmann
531 1c8addc6 Michael Hanselmann
      yield inst
532 1c8addc6 Michael Hanselmann
533 1c8addc6 Michael Hanselmann
534 1c8addc6 Michael Hanselmann
def _GetInstOperState(ctx, inst):
535 1c8addc6 Michael Hanselmann
  """Get instance's operational status.
536 1c8addc6 Michael Hanselmann

537 1c8addc6 Michael Hanselmann
  @type ctx: L{InstanceQueryData}
538 1c8addc6 Michael Hanselmann
  @type inst: L{objects.Instance}
539 1c8addc6 Michael Hanselmann
  @param inst: Instance object
540 1c8addc6 Michael Hanselmann

541 1c8addc6 Michael Hanselmann
  """
542 1c8addc6 Michael Hanselmann
  if inst.primary_node in ctx.bad_nodes:
543 1c8addc6 Michael Hanselmann
    return (constants.QRFS_NODATA, None)
544 1c8addc6 Michael Hanselmann
  else:
545 1c8addc6 Michael Hanselmann
    return (constants.QRFS_NORMAL, bool(ctx.live_data.get(inst.name)))
546 1c8addc6 Michael Hanselmann
547 1c8addc6 Michael Hanselmann
548 1c8addc6 Michael Hanselmann
def _GetInstLiveData(name):
549 1c8addc6 Michael Hanselmann
  """Build function for retrieving live data.
550 1c8addc6 Michael Hanselmann

551 1c8addc6 Michael Hanselmann
  @type name: string
552 1c8addc6 Michael Hanselmann
  @param name: Live data field name
553 1c8addc6 Michael Hanselmann

554 1c8addc6 Michael Hanselmann
  """
555 1c8addc6 Michael Hanselmann
  def fn(ctx, inst):
556 1c8addc6 Michael Hanselmann
    """Get live data for an instance.
557 1c8addc6 Michael Hanselmann

558 1c8addc6 Michael Hanselmann
    @type ctx: L{InstanceQueryData}
559 1c8addc6 Michael Hanselmann
    @type inst: L{objects.Instance}
560 1c8addc6 Michael Hanselmann
    @param inst: Instance object
561 1c8addc6 Michael Hanselmann

562 1c8addc6 Michael Hanselmann
    """
563 1c8addc6 Michael Hanselmann
    if (inst.primary_node in ctx.bad_nodes or
564 1c8addc6 Michael Hanselmann
        inst.primary_node in ctx.offline_nodes):
565 1c8addc6 Michael Hanselmann
      return (constants.QRFS_NODATA, None)
566 1c8addc6 Michael Hanselmann
567 1c8addc6 Michael Hanselmann
    if inst.name in ctx.live_data:
568 1c8addc6 Michael Hanselmann
      data = ctx.live_data[inst.name]
569 1c8addc6 Michael Hanselmann
      if name in data:
570 1c8addc6 Michael Hanselmann
        return (constants.QRFS_NORMAL, data[name])
571 1c8addc6 Michael Hanselmann
572 1c8addc6 Michael Hanselmann
    return (constants.QRFS_UNAVAIL, None)
573 1c8addc6 Michael Hanselmann
574 1c8addc6 Michael Hanselmann
  return fn
575 1c8addc6 Michael Hanselmann
576 1c8addc6 Michael Hanselmann
577 1c8addc6 Michael Hanselmann
def _GetInstStatus(ctx, inst):
578 1c8addc6 Michael Hanselmann
  """Get instance status.
579 1c8addc6 Michael Hanselmann

580 1c8addc6 Michael Hanselmann
  @type ctx: L{InstanceQueryData}
581 1c8addc6 Michael Hanselmann
  @type inst: L{objects.Instance}
582 1c8addc6 Michael Hanselmann
  @param inst: Instance object
583 1c8addc6 Michael Hanselmann

584 1c8addc6 Michael Hanselmann
  """
585 1c8addc6 Michael Hanselmann
  if inst.primary_node in ctx.offline_nodes:
586 1c8addc6 Michael Hanselmann
    return (constants.QRFS_NORMAL, "ERROR_nodeoffline")
587 1c8addc6 Michael Hanselmann
588 1c8addc6 Michael Hanselmann
  if inst.primary_node in ctx.bad_nodes:
589 1c8addc6 Michael Hanselmann
    return (constants.QRFS_NORMAL, "ERROR_nodedown")
590 1c8addc6 Michael Hanselmann
591 1c8addc6 Michael Hanselmann
  if bool(ctx.live_data.get(inst.name)):
592 1c8addc6 Michael Hanselmann
    if inst.admin_up:
593 1c8addc6 Michael Hanselmann
      return (constants.QRFS_NORMAL, "running")
594 1c8addc6 Michael Hanselmann
    else:
595 1c8addc6 Michael Hanselmann
      return (constants.QRFS_NORMAL, "ERROR_up")
596 1c8addc6 Michael Hanselmann
597 1c8addc6 Michael Hanselmann
  if inst.admin_up:
598 1c8addc6 Michael Hanselmann
    return (constants.QRFS_NORMAL, "ERROR_down")
599 1c8addc6 Michael Hanselmann
600 1c8addc6 Michael Hanselmann
  return (constants.QRFS_NORMAL, "ADMIN_down")
601 1c8addc6 Michael Hanselmann
602 1c8addc6 Michael Hanselmann
603 1c8addc6 Michael Hanselmann
def _GetInstDiskSize(index):
604 1c8addc6 Michael Hanselmann
  """Build function for retrieving disk size.
605 1c8addc6 Michael Hanselmann

606 1c8addc6 Michael Hanselmann
  @type index: int
607 1c8addc6 Michael Hanselmann
  @param index: Disk index
608 1c8addc6 Michael Hanselmann

609 1c8addc6 Michael Hanselmann
  """
610 1c8addc6 Michael Hanselmann
  def fn(_, inst):
611 1c8addc6 Michael Hanselmann
    """Get size of a disk.
612 1c8addc6 Michael Hanselmann

613 1c8addc6 Michael Hanselmann
    @type inst: L{objects.Instance}
614 1c8addc6 Michael Hanselmann
    @param inst: Instance object
615 1c8addc6 Michael Hanselmann

616 1c8addc6 Michael Hanselmann
    """
617 1c8addc6 Michael Hanselmann
    try:
618 1c8addc6 Michael Hanselmann
      return (constants.QRFS_NORMAL, inst.disks[index].size)
619 1c8addc6 Michael Hanselmann
    except IndexError:
620 1c8addc6 Michael Hanselmann
      return (constants.QRFS_UNAVAIL, None)
621 1c8addc6 Michael Hanselmann
622 1c8addc6 Michael Hanselmann
  return fn
623 1c8addc6 Michael Hanselmann
624 1c8addc6 Michael Hanselmann
625 1c8addc6 Michael Hanselmann
def _GetInstNic(index, cb):
626 1c8addc6 Michael Hanselmann
  """Build function for calling another function with an instance NIC.
627 1c8addc6 Michael Hanselmann

628 1c8addc6 Michael Hanselmann
  @type index: int
629 1c8addc6 Michael Hanselmann
  @param index: NIC index
630 1c8addc6 Michael Hanselmann
  @type cb: callable
631 1c8addc6 Michael Hanselmann
  @param cb: Callback
632 1c8addc6 Michael Hanselmann

633 1c8addc6 Michael Hanselmann
  """
634 1c8addc6 Michael Hanselmann
  def fn(ctx, inst):
635 1c8addc6 Michael Hanselmann
    """Call helper function with instance NIC.
636 1c8addc6 Michael Hanselmann

637 1c8addc6 Michael Hanselmann
    @type ctx: L{InstanceQueryData}
638 1c8addc6 Michael Hanselmann
    @type inst: L{objects.Instance}
639 1c8addc6 Michael Hanselmann
    @param inst: Instance object
640 1c8addc6 Michael Hanselmann

641 1c8addc6 Michael Hanselmann
    """
642 1c8addc6 Michael Hanselmann
    try:
643 1c8addc6 Michael Hanselmann
      nic = inst.nics[index]
644 1c8addc6 Michael Hanselmann
    except IndexError:
645 1c8addc6 Michael Hanselmann
      return (constants.QRFS_UNAVAIL, None)
646 1c8addc6 Michael Hanselmann
647 1c8addc6 Michael Hanselmann
    return cb(ctx, index, nic)
648 1c8addc6 Michael Hanselmann
649 1c8addc6 Michael Hanselmann
  return fn
650 1c8addc6 Michael Hanselmann
651 1c8addc6 Michael Hanselmann
652 1c8addc6 Michael Hanselmann
def _GetInstNicIp(ctx, _, nic): # pylint: disable-msg=W0613
653 1c8addc6 Michael Hanselmann
  """Get a NIC's IP address.
654 1c8addc6 Michael Hanselmann

655 1c8addc6 Michael Hanselmann
  @type ctx: L{InstanceQueryData}
656 1c8addc6 Michael Hanselmann
  @type nic: L{objects.NIC}
657 1c8addc6 Michael Hanselmann
  @param nic: NIC object
658 1c8addc6 Michael Hanselmann

659 1c8addc6 Michael Hanselmann
  """
660 1c8addc6 Michael Hanselmann
  if nic.ip is None:
661 1c8addc6 Michael Hanselmann
    return (constants.QRFS_UNAVAIL, None)
662 1c8addc6 Michael Hanselmann
  else:
663 1c8addc6 Michael Hanselmann
    return (constants.QRFS_NORMAL, nic.ip)
664 1c8addc6 Michael Hanselmann
665 1c8addc6 Michael Hanselmann
666 1c8addc6 Michael Hanselmann
def _GetInstNicBridge(ctx, index, _):
667 1c8addc6 Michael Hanselmann
  """Get a NIC's bridge.
668 1c8addc6 Michael Hanselmann

669 1c8addc6 Michael Hanselmann
  @type ctx: L{InstanceQueryData}
670 1c8addc6 Michael Hanselmann
  @type index: int
671 1c8addc6 Michael Hanselmann
  @param index: NIC index
672 1c8addc6 Michael Hanselmann

673 1c8addc6 Michael Hanselmann
  """
674 1c8addc6 Michael Hanselmann
  assert len(ctx.inst_nicparams) >= index
675 1c8addc6 Michael Hanselmann
676 1c8addc6 Michael Hanselmann
  nicparams = ctx.inst_nicparams[index]
677 1c8addc6 Michael Hanselmann
678 1c8addc6 Michael Hanselmann
  if nicparams[constants.NIC_MODE] == constants.NIC_MODE_BRIDGED:
679 1c8addc6 Michael Hanselmann
    return (constants.QRFS_NORMAL, nicparams[constants.NIC_LINK])
680 1c8addc6 Michael Hanselmann
  else:
681 1c8addc6 Michael Hanselmann
    return (constants.QRFS_UNAVAIL, None)
682 1c8addc6 Michael Hanselmann
683 1c8addc6 Michael Hanselmann
684 1c8addc6 Michael Hanselmann
def _GetInstAllNicBridges(ctx, inst):
685 1c8addc6 Michael Hanselmann
  """Get all network bridges for an instance.
686 1c8addc6 Michael Hanselmann

687 1c8addc6 Michael Hanselmann
  @type ctx: L{InstanceQueryData}
688 1c8addc6 Michael Hanselmann
  @type inst: L{objects.Instance}
689 1c8addc6 Michael Hanselmann
  @param inst: Instance object
690 1c8addc6 Michael Hanselmann

691 1c8addc6 Michael Hanselmann
  """
692 1c8addc6 Michael Hanselmann
  assert len(ctx.inst_nicparams) == len(inst.nics)
693 1c8addc6 Michael Hanselmann
694 1c8addc6 Michael Hanselmann
  result = []
695 1c8addc6 Michael Hanselmann
696 1c8addc6 Michael Hanselmann
  for nicp in ctx.inst_nicparams:
697 1c8addc6 Michael Hanselmann
    if nicp[constants.NIC_MODE] == constants.NIC_MODE_BRIDGED:
698 1c8addc6 Michael Hanselmann
      result.append(nicp[constants.NIC_LINK])
699 1c8addc6 Michael Hanselmann
    else:
700 1c8addc6 Michael Hanselmann
      result.append(None)
701 1c8addc6 Michael Hanselmann
702 1c8addc6 Michael Hanselmann
  assert len(result) == len(inst.nics)
703 1c8addc6 Michael Hanselmann
704 1c8addc6 Michael Hanselmann
  return (constants.QRFS_NORMAL, result)
705 1c8addc6 Michael Hanselmann
706 1c8addc6 Michael Hanselmann
707 1c8addc6 Michael Hanselmann
def _GetInstNicParam(name):
708 1c8addc6 Michael Hanselmann
  """Build function for retrieving a NIC parameter.
709 1c8addc6 Michael Hanselmann

710 1c8addc6 Michael Hanselmann
  @type name: string
711 1c8addc6 Michael Hanselmann
  @param name: Parameter name
712 1c8addc6 Michael Hanselmann

713 1c8addc6 Michael Hanselmann
  """
714 1c8addc6 Michael Hanselmann
  def fn(ctx, index, _):
715 1c8addc6 Michael Hanselmann
    """Get a NIC's bridge.
716 1c8addc6 Michael Hanselmann

717 1c8addc6 Michael Hanselmann
    @type ctx: L{InstanceQueryData}
718 1c8addc6 Michael Hanselmann
    @type inst: L{objects.Instance}
719 1c8addc6 Michael Hanselmann
    @param inst: Instance object
720 1c8addc6 Michael Hanselmann
    @type nic: L{objects.NIC}
721 1c8addc6 Michael Hanselmann
    @param nic: NIC object
722 1c8addc6 Michael Hanselmann

723 1c8addc6 Michael Hanselmann
    """
724 1c8addc6 Michael Hanselmann
    assert len(ctx.inst_nicparams) >= index
725 1c8addc6 Michael Hanselmann
    return (constants.QRFS_NORMAL, ctx.inst_nicparams[index][name])
726 1c8addc6 Michael Hanselmann
727 1c8addc6 Michael Hanselmann
  return fn
728 1c8addc6 Michael Hanselmann
729 1c8addc6 Michael Hanselmann
730 1c8addc6 Michael Hanselmann
def _GetInstanceNetworkFields():
731 1c8addc6 Michael Hanselmann
  """Get instance fields involving network interfaces.
732 1c8addc6 Michael Hanselmann

733 1c8addc6 Michael Hanselmann
  @return: List of field definitions used as input for L{_PrepareFieldList}
734 1c8addc6 Michael Hanselmann

735 1c8addc6 Michael Hanselmann
  """
736 1c8addc6 Michael Hanselmann
  nic_mac_fn = lambda ctx, _, nic: (constants.QRFS_NORMAL, nic.mac)
737 1c8addc6 Michael Hanselmann
  nic_mode_fn = _GetInstNicParam(constants.NIC_MODE)
738 1c8addc6 Michael Hanselmann
  nic_link_fn = _GetInstNicParam(constants.NIC_LINK)
739 1c8addc6 Michael Hanselmann
740 1c8addc6 Michael Hanselmann
  fields = [
741 1c8addc6 Michael Hanselmann
    # First NIC (legacy)
742 1c8addc6 Michael Hanselmann
    (_MakeField("ip", "IP_address", constants.QFT_TEXT), IQ_CONFIG,
743 1c8addc6 Michael Hanselmann
     _GetInstNic(0, _GetInstNicIp)),
744 1c8addc6 Michael Hanselmann
    (_MakeField("mac", "MAC_address", constants.QFT_TEXT), IQ_CONFIG,
745 1c8addc6 Michael Hanselmann
     _GetInstNic(0, nic_mac_fn)),
746 1c8addc6 Michael Hanselmann
    (_MakeField("bridge", "Bridge", constants.QFT_TEXT), IQ_CONFIG,
747 1c8addc6 Michael Hanselmann
     _GetInstNic(0, _GetInstNicBridge)),
748 1c8addc6 Michael Hanselmann
    (_MakeField("nic_mode", "NIC_Mode", constants.QFT_TEXT), IQ_CONFIG,
749 1c8addc6 Michael Hanselmann
     _GetInstNic(0, nic_mode_fn)),
750 1c8addc6 Michael Hanselmann
    (_MakeField("nic_link", "NIC_Link", constants.QFT_TEXT), IQ_CONFIG,
751 1c8addc6 Michael Hanselmann
     _GetInstNic(0, nic_link_fn)),
752 1c8addc6 Michael Hanselmann
753 1c8addc6 Michael Hanselmann
    # All NICs
754 1c8addc6 Michael Hanselmann
    (_MakeField("nic.count", "NICs", constants.QFT_NUMBER), IQ_CONFIG,
755 1c8addc6 Michael Hanselmann
     lambda ctx, inst: (constants.QRFS_NORMAL, len(inst.nics))),
756 1c8addc6 Michael Hanselmann
    (_MakeField("nic.macs", "NIC_MACs", constants.QFT_OTHER), IQ_CONFIG,
757 1c8addc6 Michael Hanselmann
     lambda ctx, inst: (constants.QRFS_NORMAL, [nic.mac for nic in inst.nics])),
758 1c8addc6 Michael Hanselmann
    (_MakeField("nic.ips", "NIC_IPs", constants.QFT_OTHER), IQ_CONFIG,
759 1c8addc6 Michael Hanselmann
     lambda ctx, inst: (constants.QRFS_NORMAL, [nic.ip for nic in inst.nics])),
760 1c8addc6 Michael Hanselmann
    (_MakeField("nic.modes", "NIC_modes", constants.QFT_OTHER), IQ_CONFIG,
761 1c8addc6 Michael Hanselmann
     lambda ctx, inst: (constants.QRFS_NORMAL,
762 1c8addc6 Michael Hanselmann
                        [nicp[constants.NIC_MODE]
763 1c8addc6 Michael Hanselmann
                         for nicp in ctx.inst_nicparams])),
764 1c8addc6 Michael Hanselmann
    (_MakeField("nic.links", "NIC_links", constants.QFT_OTHER), IQ_CONFIG,
765 1c8addc6 Michael Hanselmann
     lambda ctx, inst: (constants.QRFS_NORMAL,
766 1c8addc6 Michael Hanselmann
                        [nicp[constants.NIC_LINK]
767 1c8addc6 Michael Hanselmann
                         for nicp in ctx.inst_nicparams])),
768 1c8addc6 Michael Hanselmann
    (_MakeField("nic.bridges", "NIC_bridges", constants.QFT_OTHER), IQ_CONFIG,
769 1c8addc6 Michael Hanselmann
     _GetInstAllNicBridges),
770 1c8addc6 Michael Hanselmann
    ]
771 1c8addc6 Michael Hanselmann
772 1c8addc6 Michael Hanselmann
  # NICs by number
773 1c8addc6 Michael Hanselmann
  for i in range(constants.MAX_NICS):
774 1c8addc6 Michael Hanselmann
    fields.extend([
775 1c8addc6 Michael Hanselmann
      (_MakeField("nic.ip/%s" % i, "NicIP/%s" % i, constants.QFT_TEXT),
776 1c8addc6 Michael Hanselmann
       IQ_CONFIG, _GetInstNic(i, _GetInstNicIp)),
777 1c8addc6 Michael Hanselmann
      (_MakeField("nic.mac/%s" % i, "NicMAC/%s" % i, constants.QFT_TEXT),
778 1c8addc6 Michael Hanselmann
       IQ_CONFIG, _GetInstNic(i, nic_mac_fn)),
779 1c8addc6 Michael Hanselmann
      (_MakeField("nic.mode/%s" % i, "NicMode/%s" % i, constants.QFT_TEXT),
780 1c8addc6 Michael Hanselmann
       IQ_CONFIG, _GetInstNic(i, nic_mode_fn)),
781 1c8addc6 Michael Hanselmann
      (_MakeField("nic.link/%s" % i, "NicLink/%s" % i, constants.QFT_TEXT),
782 1c8addc6 Michael Hanselmann
       IQ_CONFIG, _GetInstNic(i, nic_link_fn)),
783 1c8addc6 Michael Hanselmann
      (_MakeField("nic.bridge/%s" % i, "NicBridge/%s" % i, constants.QFT_TEXT),
784 1c8addc6 Michael Hanselmann
       IQ_CONFIG, _GetInstNic(i, _GetInstNicBridge)),
785 1c8addc6 Michael Hanselmann
      ])
786 1c8addc6 Michael Hanselmann
787 1c8addc6 Michael Hanselmann
  return fields
788 1c8addc6 Michael Hanselmann
789 1c8addc6 Michael Hanselmann
790 1c8addc6 Michael Hanselmann
def _GetInstDiskUsage(ctx, inst):
791 1c8addc6 Michael Hanselmann
  """Get disk usage for an instance.
792 1c8addc6 Michael Hanselmann

793 1c8addc6 Michael Hanselmann
  @type ctx: L{InstanceQueryData}
794 1c8addc6 Michael Hanselmann
  @type inst: L{objects.Instance}
795 1c8addc6 Michael Hanselmann
  @param inst: Instance object
796 1c8addc6 Michael Hanselmann

797 1c8addc6 Michael Hanselmann
  """
798 1c8addc6 Michael Hanselmann
  usage = ctx.disk_usage[inst.name]
799 1c8addc6 Michael Hanselmann
800 1c8addc6 Michael Hanselmann
  if usage is None:
801 1c8addc6 Michael Hanselmann
    usage = 0
802 1c8addc6 Michael Hanselmann
803 1c8addc6 Michael Hanselmann
  return (constants.QRFS_NORMAL, usage)
804 1c8addc6 Michael Hanselmann
805 1c8addc6 Michael Hanselmann
806 1c8addc6 Michael Hanselmann
def _GetInstanceDiskFields():
807 1c8addc6 Michael Hanselmann
  """Get instance fields involving disks.
808 1c8addc6 Michael Hanselmann

809 1c8addc6 Michael Hanselmann
  @return: List of field definitions used as input for L{_PrepareFieldList}
810 1c8addc6 Michael Hanselmann

811 1c8addc6 Michael Hanselmann
  """
812 1c8addc6 Michael Hanselmann
  fields = [
813 1c8addc6 Michael Hanselmann
    (_MakeField("disk_usage", "DiskUsage", constants.QFT_UNIT), IQ_DISKUSAGE,
814 1c8addc6 Michael Hanselmann
     _GetInstDiskUsage),
815 1c8addc6 Michael Hanselmann
    (_MakeField("sda_size", "LegacyDisk/0", constants.QFT_UNIT), IQ_CONFIG,
816 1c8addc6 Michael Hanselmann
     _GetInstDiskSize(0)),
817 1c8addc6 Michael Hanselmann
    (_MakeField("sdb_size", "LegacyDisk/1", constants.QFT_UNIT), IQ_CONFIG,
818 1c8addc6 Michael Hanselmann
     _GetInstDiskSize(1)),
819 1c8addc6 Michael Hanselmann
    (_MakeField("disk.count", "Disks", constants.QFT_NUMBER), IQ_CONFIG,
820 1c8addc6 Michael Hanselmann
     lambda ctx, inst: (constants.QRFS_NORMAL, len(inst.disks))),
821 1c8addc6 Michael Hanselmann
    (_MakeField("disk.sizes", "Disk_sizes", constants.QFT_OTHER), IQ_CONFIG,
822 1c8addc6 Michael Hanselmann
     lambda ctx, inst: (constants.QRFS_NORMAL,
823 1c8addc6 Michael Hanselmann
                        [disk.size for disk in inst.disks])),
824 1c8addc6 Michael Hanselmann
    ]
825 1c8addc6 Michael Hanselmann
826 1c8addc6 Michael Hanselmann
  # Disks by number
827 1c8addc6 Michael Hanselmann
  fields.extend([
828 1c8addc6 Michael Hanselmann
    (_MakeField("disk.size/%s" % i, "Disk/%s" % i, constants.QFT_UNIT),
829 1c8addc6 Michael Hanselmann
     IQ_CONFIG, _GetInstDiskSize(i))
830 1c8addc6 Michael Hanselmann
    for i in range(constants.MAX_DISKS)
831 1c8addc6 Michael Hanselmann
    ])
832 1c8addc6 Michael Hanselmann
833 1c8addc6 Michael Hanselmann
  return fields
834 1c8addc6 Michael Hanselmann
835 1c8addc6 Michael Hanselmann
836 1c8addc6 Michael Hanselmann
def _GetInstanceParameterFields():
837 1c8addc6 Michael Hanselmann
  """Get instance fields involving parameters.
838 1c8addc6 Michael Hanselmann

839 1c8addc6 Michael Hanselmann
  @return: List of field definitions used as input for L{_PrepareFieldList}
840 1c8addc6 Michael Hanselmann

841 1c8addc6 Michael Hanselmann
  """
842 1c8addc6 Michael Hanselmann
  # TODO: Consider moving titles closer to constants
843 1c8addc6 Michael Hanselmann
  be_title = {
844 1c8addc6 Michael Hanselmann
    constants.BE_AUTO_BALANCE: "Auto_balance",
845 1c8addc6 Michael Hanselmann
    constants.BE_MEMORY: "Configured_memory",
846 1c8addc6 Michael Hanselmann
    constants.BE_VCPUS: "VCPUs",
847 1c8addc6 Michael Hanselmann
    }
848 1c8addc6 Michael Hanselmann
849 1c8addc6 Michael Hanselmann
  hv_title = {
850 1c8addc6 Michael Hanselmann
    constants.HV_ACPI: "ACPI",
851 1c8addc6 Michael Hanselmann
    constants.HV_BOOT_ORDER: "Boot_order",
852 1c8addc6 Michael Hanselmann
    constants.HV_CDROM_IMAGE_PATH: "CDROM_image_path",
853 1c8addc6 Michael Hanselmann
    constants.HV_DISK_TYPE: "Disk_type",
854 1c8addc6 Michael Hanselmann
    constants.HV_INITRD_PATH: "Initrd_path",
855 1c8addc6 Michael Hanselmann
    constants.HV_KERNEL_PATH: "Kernel_path",
856 1c8addc6 Michael Hanselmann
    constants.HV_NIC_TYPE: "NIC_type",
857 1c8addc6 Michael Hanselmann
    constants.HV_PAE: "PAE",
858 1c8addc6 Michael Hanselmann
    constants.HV_VNC_BIND_ADDRESS: "VNC_bind_address",
859 1c8addc6 Michael Hanselmann
    }
860 1c8addc6 Michael Hanselmann
861 1c8addc6 Michael Hanselmann
  fields = [
862 1c8addc6 Michael Hanselmann
    # Filled parameters
863 1c8addc6 Michael Hanselmann
    (_MakeField("hvparams", "HypervisorParameters", constants.QFT_OTHER),
864 1c8addc6 Michael Hanselmann
     IQ_CONFIG, lambda ctx, _: (constants.QRFS_NORMAL, ctx.inst_hvparams)),
865 1c8addc6 Michael Hanselmann
    (_MakeField("beparams", "BackendParameters", constants.QFT_OTHER),
866 1c8addc6 Michael Hanselmann
     IQ_CONFIG, lambda ctx, _: (constants.QRFS_NORMAL, ctx.inst_beparams)),
867 1c8addc6 Michael Hanselmann
    (_MakeField("vcpus", "LegacyVCPUs", constants.QFT_NUMBER), IQ_CONFIG,
868 1c8addc6 Michael Hanselmann
     lambda ctx, _: (constants.QRFS_NORMAL,
869 1c8addc6 Michael Hanselmann
                     ctx.inst_beparams[constants.BE_VCPUS])),
870 1c8addc6 Michael Hanselmann
871 1c8addc6 Michael Hanselmann
    # Unfilled parameters
872 1c8addc6 Michael Hanselmann
    (_MakeField("custom_hvparams", "CustomHypervisorParameters",
873 1c8addc6 Michael Hanselmann
                constants.QFT_OTHER),
874 1c8addc6 Michael Hanselmann
     IQ_CONFIG, lambda ctx, inst: (constants.QRFS_NORMAL, inst.hvparams)),
875 1c8addc6 Michael Hanselmann
    (_MakeField("custom_beparams", "CustomBackendParameters",
876 1c8addc6 Michael Hanselmann
                constants.QFT_OTHER),
877 1c8addc6 Michael Hanselmann
     IQ_CONFIG, lambda ctx, inst: (constants.QRFS_NORMAL, inst.beparams)),
878 1c8addc6 Michael Hanselmann
    (_MakeField("custom_nicparams", "CustomNicParameters",
879 1c8addc6 Michael Hanselmann
                constants.QFT_OTHER),
880 1c8addc6 Michael Hanselmann
     IQ_CONFIG, lambda ctx, inst: (constants.QRFS_NORMAL,
881 1c8addc6 Michael Hanselmann
                                   [nic.nicparams for nic in inst.nics])),
882 1c8addc6 Michael Hanselmann
    ]
883 1c8addc6 Michael Hanselmann
884 1c8addc6 Michael Hanselmann
  # HV params
885 1c8addc6 Michael Hanselmann
  def _GetInstHvParam(name):
886 1c8addc6 Michael Hanselmann
    return lambda ctx, _: (constants.QRFS_NORMAL,
887 1c8addc6 Michael Hanselmann
                           ctx.inst_hvparams.get(name, None))
888 1c8addc6 Michael Hanselmann
889 1c8addc6 Michael Hanselmann
  fields.extend([
890 1c8addc6 Michael Hanselmann
    # For now all hypervisor parameters are exported as QFT_OTHER
891 1c8addc6 Michael Hanselmann
    (_MakeField("hv/%s" % name, hv_title.get(name, "hv/%s" % name),
892 1c8addc6 Michael Hanselmann
                constants.QFT_OTHER),
893 1c8addc6 Michael Hanselmann
     IQ_CONFIG, _GetInstHvParam(name))
894 1c8addc6 Michael Hanselmann
    for name in constants.HVS_PARAMETERS
895 1c8addc6 Michael Hanselmann
    if name not in constants.HVC_GLOBALS
896 1c8addc6 Michael Hanselmann
    ])
897 1c8addc6 Michael Hanselmann
898 1c8addc6 Michael Hanselmann
  # BE params
899 1c8addc6 Michael Hanselmann
  def _GetInstBeParam(name):
900 1c8addc6 Michael Hanselmann
    return lambda ctx, _: (constants.QRFS_NORMAL,
901 1c8addc6 Michael Hanselmann
                           ctx.inst_beparams.get(name, None))
902 1c8addc6 Michael Hanselmann
903 1c8addc6 Michael Hanselmann
  fields.extend([
904 1c8addc6 Michael Hanselmann
    # For now all backend parameters are exported as QFT_OTHER
905 1c8addc6 Michael Hanselmann
    (_MakeField("be/%s" % name, be_title.get(name, "be/%s" % name),
906 1c8addc6 Michael Hanselmann
                constants.QFT_OTHER),
907 1c8addc6 Michael Hanselmann
     IQ_CONFIG, _GetInstBeParam(name))
908 1c8addc6 Michael Hanselmann
    for name in constants.BES_PARAMETERS
909 1c8addc6 Michael Hanselmann
    ])
910 1c8addc6 Michael Hanselmann
911 1c8addc6 Michael Hanselmann
  return fields
912 1c8addc6 Michael Hanselmann
913 1c8addc6 Michael Hanselmann
914 1c8addc6 Michael Hanselmann
_INST_SIMPLE_FIELDS = {
915 1c8addc6 Michael Hanselmann
  "disk_template": ("Disk_template", constants.QFT_TEXT),
916 1c8addc6 Michael Hanselmann
  "hypervisor": ("Hypervisor", constants.QFT_TEXT),
917 1c8addc6 Michael Hanselmann
  "name": ("Node", constants.QFT_TEXT),
918 1c8addc6 Michael Hanselmann
  # Depending on the hypervisor, the port can be None
919 1c8addc6 Michael Hanselmann
  "network_port": ("Network_port", constants.QFT_OTHER),
920 1c8addc6 Michael Hanselmann
  "os": ("OS", constants.QFT_TEXT),
921 1c8addc6 Michael Hanselmann
  "serial_no": ("SerialNo", constants.QFT_NUMBER),
922 1c8addc6 Michael Hanselmann
  "uuid": ("UUID", constants.QFT_TEXT),
923 1c8addc6 Michael Hanselmann
  }
924 1c8addc6 Michael Hanselmann
925 1c8addc6 Michael Hanselmann
926 1c8addc6 Michael Hanselmann
def _BuildInstanceFields():
927 1c8addc6 Michael Hanselmann
  """Builds list of fields for instance queries.
928 1c8addc6 Michael Hanselmann

929 1c8addc6 Michael Hanselmann
  """
930 1c8addc6 Michael Hanselmann
  fields = [
931 1c8addc6 Michael Hanselmann
    (_MakeField("pnode", "Primary_node", constants.QFT_TEXT), IQ_CONFIG,
932 1c8addc6 Michael Hanselmann
     lambda ctx, inst: (constants.QRFS_NORMAL, inst.primary_node)),
933 1c8addc6 Michael Hanselmann
    (_MakeField("snodes", "Secondary_Nodes", constants.QFT_OTHER), IQ_CONFIG,
934 1c8addc6 Michael Hanselmann
     lambda ctx, inst: (constants.QRFS_NORMAL, list(inst.secondary_nodes))),
935 1c8addc6 Michael Hanselmann
    (_MakeField("admin_state", "Autostart", constants.QFT_BOOL), IQ_CONFIG,
936 1c8addc6 Michael Hanselmann
     lambda ctx, inst: (constants.QRFS_NORMAL, inst.admin_up)),
937 1c8addc6 Michael Hanselmann
    (_MakeField("tags", "Tags", constants.QFT_OTHER), IQ_CONFIG,
938 1c8addc6 Michael Hanselmann
     lambda ctx, inst: (constants.QRFS_NORMAL, list(inst.GetTags()))),
939 1c8addc6 Michael Hanselmann
    ]
940 1c8addc6 Michael Hanselmann
941 1c8addc6 Michael Hanselmann
  # Add simple fields
942 1c8addc6 Michael Hanselmann
  fields.extend([(_MakeField(name, title, kind), IQ_CONFIG, _GetItemAttr(name))
943 1c8addc6 Michael Hanselmann
                 for (name, (title, kind)) in _INST_SIMPLE_FIELDS.items()])
944 1c8addc6 Michael Hanselmann
945 1c8addc6 Michael Hanselmann
  # Fields requiring talking to the node
946 1c8addc6 Michael Hanselmann
  fields.extend([
947 1c8addc6 Michael Hanselmann
    (_MakeField("oper_state", "Running", constants.QFT_BOOL), IQ_LIVE,
948 1c8addc6 Michael Hanselmann
     _GetInstOperState),
949 1c8addc6 Michael Hanselmann
    (_MakeField("oper_ram", "RuntimeMemory", constants.QFT_UNIT), IQ_LIVE,
950 1c8addc6 Michael Hanselmann
     _GetInstLiveData("memory")),
951 1c8addc6 Michael Hanselmann
    (_MakeField("oper_vcpus", "RuntimeVCPUs", constants.QFT_NUMBER), IQ_LIVE,
952 1c8addc6 Michael Hanselmann
     _GetInstLiveData("vcpus")),
953 1c8addc6 Michael Hanselmann
    (_MakeField("status", "Status", constants.QFT_TEXT), IQ_LIVE,
954 1c8addc6 Michael Hanselmann
     _GetInstStatus),
955 1c8addc6 Michael Hanselmann
    ])
956 1c8addc6 Michael Hanselmann
957 1c8addc6 Michael Hanselmann
  fields.extend(_GetInstanceParameterFields())
958 1c8addc6 Michael Hanselmann
  fields.extend(_GetInstanceDiskFields())
959 1c8addc6 Michael Hanselmann
  fields.extend(_GetInstanceNetworkFields())
960 145bea54 Michael Hanselmann
  fields.extend(_GetItemTimestampFields(IQ_CONFIG))
961 1c8addc6 Michael Hanselmann
962 1c8addc6 Michael Hanselmann
  return _PrepareFieldList(fields)
963 1c8addc6 Michael Hanselmann
964 1c8addc6 Michael Hanselmann
965 8235fe04 Michael Hanselmann
#: Fields available for node queries
966 8235fe04 Michael Hanselmann
NODE_FIELDS = _BuildNodeFields()
967 1c8addc6 Michael Hanselmann
968 1c8addc6 Michael Hanselmann
#: Fields available for instance queries
969 1c8addc6 Michael Hanselmann
INSTANCE_FIELDS = _BuildInstanceFields()