Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.query_unittest.py @ 8235fe04

History | View | Annotate | Download (17.7 kB)

1 4ca96421 Michael Hanselmann
#!/usr/bin/python
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
"""Script for testing ganeti.query"""
23 4ca96421 Michael Hanselmann
24 4ca96421 Michael Hanselmann
import re
25 4ca96421 Michael Hanselmann
import unittest
26 4ca96421 Michael Hanselmann
27 4ca96421 Michael Hanselmann
from ganeti import constants
28 4ca96421 Michael Hanselmann
from ganeti import utils
29 4ca96421 Michael Hanselmann
from ganeti import compat
30 4ca96421 Michael Hanselmann
from ganeti import errors
31 4ca96421 Michael Hanselmann
from ganeti import query
32 4ca96421 Michael Hanselmann
from ganeti import objects
33 4ca96421 Michael Hanselmann
34 4ca96421 Michael Hanselmann
import testutils
35 4ca96421 Michael Hanselmann
36 4ca96421 Michael Hanselmann
37 4ca96421 Michael Hanselmann
class TestConstants(unittest.TestCase):
38 4ca96421 Michael Hanselmann
  def test(self):
39 4ca96421 Michael Hanselmann
    self.assertEqual(set(query._VERIFY_FN.keys()),
40 4ca96421 Michael Hanselmann
                     constants.QFT_ALL)
41 4ca96421 Michael Hanselmann
42 4ca96421 Michael Hanselmann
43 4ca96421 Michael Hanselmann
class _QueryData:
44 4ca96421 Michael Hanselmann
  def __init__(self, data, **kwargs):
45 4ca96421 Michael Hanselmann
    self.data = data
46 4ca96421 Michael Hanselmann
47 4ca96421 Michael Hanselmann
    for name, value in kwargs.items():
48 4ca96421 Michael Hanselmann
      setattr(self, name, value)
49 4ca96421 Michael Hanselmann
50 4ca96421 Michael Hanselmann
  def __iter__(self):
51 4ca96421 Michael Hanselmann
    return iter(self.data)
52 4ca96421 Michael Hanselmann
53 4ca96421 Michael Hanselmann
54 4ca96421 Michael Hanselmann
def _GetDiskSize(nr, ctx, item):
55 4ca96421 Michael Hanselmann
  disks = item["disks"]
56 4ca96421 Michael Hanselmann
  try:
57 4ca96421 Michael Hanselmann
    return (constants.QRFS_NORMAL, disks[nr])
58 4ca96421 Michael Hanselmann
  except IndexError:
59 4ca96421 Michael Hanselmann
    return (constants.QRFS_UNAVAIL, None)
60 4ca96421 Michael Hanselmann
61 4ca96421 Michael Hanselmann
62 4ca96421 Michael Hanselmann
class TestQuery(unittest.TestCase):
63 4ca96421 Michael Hanselmann
  def test(self):
64 4ca96421 Michael Hanselmann
    (STATIC, DISK) = range(10, 12)
65 4ca96421 Michael Hanselmann
66 4ca96421 Michael Hanselmann
    fielddef = query._PrepareFieldList([
67 4ca96421 Michael Hanselmann
      (query._MakeField("name", "Name", constants.QFT_TEXT),
68 4ca96421 Michael Hanselmann
       STATIC, lambda ctx, item: (constants.QRFS_NORMAL, item["name"])),
69 4ca96421 Michael Hanselmann
      (query._MakeField("master", "Master", constants.QFT_BOOL),
70 4ca96421 Michael Hanselmann
       STATIC, lambda ctx, item: (constants.QRFS_NORMAL,
71 4ca96421 Michael Hanselmann
                                  ctx.mastername == item["name"])),
72 4ca96421 Michael Hanselmann
      ] +
73 4ca96421 Michael Hanselmann
      [(query._MakeField("disk%s.size" % i, "DiskSize%s" % i,
74 4ca96421 Michael Hanselmann
                         constants.QFT_UNIT),
75 4ca96421 Michael Hanselmann
        DISK, compat.partial(_GetDiskSize, i))
76 4ca96421 Michael Hanselmann
       for i in range(4)])
77 4ca96421 Michael Hanselmann
78 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["name"])
79 4ca96421 Michael Hanselmann
    self.assertEqual(q.RequestedData(), set([STATIC]))
80 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 1)
81 4ca96421 Michael Hanselmann
    self.assertEqual(len(q.GetFields()), 1)
82 4ca96421 Michael Hanselmann
    self.assertEqual(q.GetFields()[0].ToDict(),
83 4ca96421 Michael Hanselmann
      objects.QueryFieldDefinition(name="name",
84 4ca96421 Michael Hanselmann
                                   title="Name",
85 4ca96421 Michael Hanselmann
                                   kind=constants.QFT_TEXT).ToDict())
86 4ca96421 Michael Hanselmann
87 4ca96421 Michael Hanselmann
    # Create data only once query has been prepared
88 4ca96421 Michael Hanselmann
    data = [
89 4ca96421 Michael Hanselmann
      { "name": "node1", "disks": [0, 1, 2], },
90 4ca96421 Michael Hanselmann
      { "name": "node2", "disks": [3, 4], },
91 4ca96421 Michael Hanselmann
      { "name": "node3", "disks": [5, 6, 7], },
92 4ca96421 Michael Hanselmann
      ]
93 4ca96421 Michael Hanselmann
94 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(data, mastername="node3")),
95 4ca96421 Michael Hanselmann
                     [[(constants.QRFS_NORMAL, "node1")],
96 4ca96421 Michael Hanselmann
                      [(constants.QRFS_NORMAL, "node2")],
97 4ca96421 Michael Hanselmann
                      [(constants.QRFS_NORMAL, "node3")]])
98 4ca96421 Michael Hanselmann
    self.assertEqual(q.OldStyleQuery(_QueryData(data, mastername="node3")),
99 4ca96421 Michael Hanselmann
                     [["node1"], ["node2"], ["node3"]])
100 4ca96421 Michael Hanselmann
101 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["name", "master"])
102 4ca96421 Michael Hanselmann
    self.assertEqual(q.RequestedData(), set([STATIC]))
103 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 2)
104 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(data, mastername="node3")),
105 4ca96421 Michael Hanselmann
                     [[(constants.QRFS_NORMAL, "node1"),
106 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, False)],
107 4ca96421 Michael Hanselmann
                      [(constants.QRFS_NORMAL, "node2"),
108 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, False)],
109 4ca96421 Michael Hanselmann
                      [(constants.QRFS_NORMAL, "node3"),
110 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, True)],
111 4ca96421 Michael Hanselmann
                     ])
112 4ca96421 Michael Hanselmann
113 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["name", "master", "disk0.size"])
114 4ca96421 Michael Hanselmann
    self.assertEqual(q.RequestedData(), set([STATIC, DISK]))
115 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 3)
116 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(data, mastername="node2")),
117 4ca96421 Michael Hanselmann
                     [[(constants.QRFS_NORMAL, "node1"),
118 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, False),
119 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, 0)],
120 4ca96421 Michael Hanselmann
                      [(constants.QRFS_NORMAL, "node2"),
121 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, True),
122 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, 3)],
123 4ca96421 Michael Hanselmann
                      [(constants.QRFS_NORMAL, "node3"),
124 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, False),
125 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, 5)],
126 4ca96421 Michael Hanselmann
                     ])
127 4ca96421 Michael Hanselmann
128 4ca96421 Michael Hanselmann
    # With unknown column
129 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["disk2.size", "disk1.size", "disk99.size",
130 4ca96421 Michael Hanselmann
                               "disk0.size"])
131 4ca96421 Michael Hanselmann
    self.assertEqual(q.RequestedData(), set([DISK]))
132 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 4)
133 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(data, mastername="node2")),
134 4ca96421 Michael Hanselmann
                     [[(constants.QRFS_NORMAL, 2),
135 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, 1),
136 4ca96421 Michael Hanselmann
                       (constants.QRFS_UNKNOWN, None),
137 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, 0)],
138 4ca96421 Michael Hanselmann
                      [(constants.QRFS_UNAVAIL, None),
139 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, 4),
140 4ca96421 Michael Hanselmann
                       (constants.QRFS_UNKNOWN, None),
141 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, 3)],
142 4ca96421 Michael Hanselmann
                      [(constants.QRFS_NORMAL, 7),
143 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, 6),
144 4ca96421 Michael Hanselmann
                       (constants.QRFS_UNKNOWN, None),
145 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, 5)],
146 4ca96421 Michael Hanselmann
                     ])
147 4ca96421 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, q.OldStyleQuery,
148 4ca96421 Michael Hanselmann
                      _QueryData(data, mastername="node2"))
149 4ca96421 Michael Hanselmann
    self.assertEqual([fdef.ToDict() for fdef in q.GetFields()], [
150 4ca96421 Michael Hanselmann
                     { "name": "disk2.size", "title": "DiskSize2",
151 4ca96421 Michael Hanselmann
                       "kind": constants.QFT_UNIT, },
152 4ca96421 Michael Hanselmann
                     { "name": "disk1.size", "title": "DiskSize1",
153 4ca96421 Michael Hanselmann
                       "kind": constants.QFT_UNIT, },
154 4ca96421 Michael Hanselmann
                     { "name": "disk99.size", "title": "disk99.size",
155 4ca96421 Michael Hanselmann
                       "kind": constants.QFT_UNKNOWN, },
156 4ca96421 Michael Hanselmann
                     { "name": "disk0.size", "title": "DiskSize0",
157 4ca96421 Michael Hanselmann
                       "kind": constants.QFT_UNIT, },
158 4ca96421 Michael Hanselmann
                     ])
159 4ca96421 Michael Hanselmann
160 4ca96421 Michael Hanselmann
    # Empty query
161 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, [])
162 4ca96421 Michael Hanselmann
    self.assertEqual(q.RequestedData(), set([]))
163 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 0)
164 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(data, mastername="node2")),
165 4ca96421 Michael Hanselmann
                     [[], [], []])
166 4ca96421 Michael Hanselmann
    self.assertEqual(q.OldStyleQuery(_QueryData(data, mastername="node2")),
167 4ca96421 Michael Hanselmann
                     [[], [], []])
168 4ca96421 Michael Hanselmann
    self.assertEqual(q.GetFields(), [])
169 4ca96421 Michael Hanselmann
170 4ca96421 Michael Hanselmann
  def testPrepareFieldList(self):
171 4ca96421 Michael Hanselmann
    # Duplicate titles
172 4ca96421 Michael Hanselmann
    for (a, b) in [("name", "name"), ("NAME", "name")]:
173 4ca96421 Michael Hanselmann
      self.assertRaises(AssertionError, query._PrepareFieldList, [
174 4ca96421 Michael Hanselmann
        (query._MakeField("name", b, constants.QFT_TEXT), None,
175 4ca96421 Michael Hanselmann
         lambda *args: None),
176 4ca96421 Michael Hanselmann
        (query._MakeField("other", a, constants.QFT_TEXT), None,
177 4ca96421 Michael Hanselmann
         lambda *args: None),
178 4ca96421 Michael Hanselmann
        ])
179 4ca96421 Michael Hanselmann
180 4ca96421 Michael Hanselmann
    # Non-lowercase names
181 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
182 4ca96421 Michael Hanselmann
      (query._MakeField("NAME", "Name", constants.QFT_TEXT), None,
183 4ca96421 Michael Hanselmann
       lambda *args: None),
184 4ca96421 Michael Hanselmann
      ])
185 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
186 4ca96421 Michael Hanselmann
      (query._MakeField("Name", "Name", constants.QFT_TEXT), None,
187 4ca96421 Michael Hanselmann
       lambda *args: None),
188 4ca96421 Michael Hanselmann
      ])
189 4ca96421 Michael Hanselmann
190 4ca96421 Michael Hanselmann
    # Empty name
191 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
192 4ca96421 Michael Hanselmann
      (query._MakeField("", "Name", constants.QFT_TEXT), None,
193 4ca96421 Michael Hanselmann
       lambda *args: None),
194 4ca96421 Michael Hanselmann
      ])
195 4ca96421 Michael Hanselmann
196 4ca96421 Michael Hanselmann
    # Empty title
197 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
198 4ca96421 Michael Hanselmann
      (query._MakeField("name", "", constants.QFT_TEXT), None,
199 4ca96421 Michael Hanselmann
       lambda *args: None),
200 4ca96421 Michael Hanselmann
      ])
201 4ca96421 Michael Hanselmann
202 4ca96421 Michael Hanselmann
    # Whitespace in title
203 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
204 4ca96421 Michael Hanselmann
      (query._MakeField("name", "Co lu mn", constants.QFT_TEXT), None,
205 4ca96421 Michael Hanselmann
       lambda *args: None),
206 4ca96421 Michael Hanselmann
      ])
207 4ca96421 Michael Hanselmann
208 4ca96421 Michael Hanselmann
    # No callable function
209 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
210 4ca96421 Michael Hanselmann
      (query._MakeField("name", "Name", constants.QFT_TEXT), None, None),
211 4ca96421 Michael Hanselmann
      ])
212 4ca96421 Michael Hanselmann
213 4ca96421 Michael Hanselmann
  def testUnknown(self):
214 4ca96421 Michael Hanselmann
    fielddef = query._PrepareFieldList([
215 4ca96421 Michael Hanselmann
      (query._MakeField("name", "Name", constants.QFT_TEXT),
216 4ca96421 Michael Hanselmann
       None, lambda _, item: (constants.QRFS_NORMAL, "name%s" % item)),
217 4ca96421 Michael Hanselmann
      (query._MakeField("other0", "Other0", constants.QFT_TIMESTAMP),
218 4ca96421 Michael Hanselmann
       None, lambda *args: (constants.QRFS_NORMAL, 1234)),
219 4ca96421 Michael Hanselmann
      (query._MakeField("nodata", "NoData", constants.QFT_NUMBER),
220 4ca96421 Michael Hanselmann
       None, lambda *args: (constants.QRFS_NODATA, None)),
221 4ca96421 Michael Hanselmann
      (query._MakeField("unavail", "Unavail", constants.QFT_BOOL),
222 4ca96421 Michael Hanselmann
       None, lambda *args: (constants.QRFS_UNAVAIL, None)),
223 4ca96421 Michael Hanselmann
      ])
224 4ca96421 Michael Hanselmann
225 4ca96421 Michael Hanselmann
    for selected in [["foo"], ["Hello", "World"],
226 4ca96421 Michael Hanselmann
                     ["name1", "other", "foo"]]:
227 4ca96421 Michael Hanselmann
      q = query.Query(fielddef, selected)
228 4ca96421 Michael Hanselmann
      self.assertEqual(len(q._fields), len(selected))
229 4ca96421 Michael Hanselmann
      self.assert_(compat.all(len(row) == len(selected)
230 4ca96421 Michael Hanselmann
                              for row in q.Query(_QueryData(range(1, 10)))))
231 4ca96421 Michael Hanselmann
      self.assertEqual(q.Query(_QueryData(range(1, 10))),
232 4ca96421 Michael Hanselmann
                       [[(constants.QRFS_UNKNOWN, None)] * len(selected)
233 4ca96421 Michael Hanselmann
                        for i in range(1, 10)])
234 4ca96421 Michael Hanselmann
      self.assertEqual([fdef.ToDict() for fdef in q.GetFields()],
235 4ca96421 Michael Hanselmann
                       [{ "name": name, "title": name,
236 4ca96421 Michael Hanselmann
                          "kind": constants.QFT_UNKNOWN, }
237 4ca96421 Michael Hanselmann
                        for name in selected])
238 4ca96421 Michael Hanselmann
239 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["name", "other0", "nodata", "unavail"])
240 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 4)
241 4ca96421 Michael Hanselmann
    self.assertEqual(q.OldStyleQuery(_QueryData(range(1, 10))), [
242 4ca96421 Michael Hanselmann
                     ["name%s" % i, 1234, None, None]
243 4ca96421 Michael Hanselmann
                     for i in range(1, 10)
244 4ca96421 Michael Hanselmann
                     ])
245 4ca96421 Michael Hanselmann
246 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["name", "other0", "nodata", "unavail", "unk"])
247 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 5)
248 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(range(1, 10))),
249 4ca96421 Michael Hanselmann
                     [[(constants.QRFS_NORMAL, "name%s" % i),
250 4ca96421 Michael Hanselmann
                       (constants.QRFS_NORMAL, 1234),
251 4ca96421 Michael Hanselmann
                       (constants.QRFS_NODATA, None),
252 4ca96421 Michael Hanselmann
                       (constants.QRFS_UNAVAIL, None),
253 4ca96421 Michael Hanselmann
                       (constants.QRFS_UNKNOWN, None)]
254 4ca96421 Michael Hanselmann
                      for i in range(1, 10)])
255 4ca96421 Michael Hanselmann
256 4ca96421 Michael Hanselmann
257 8235fe04 Michael Hanselmann
class TestGetNodeRole(unittest.TestCase):
258 8235fe04 Michael Hanselmann
  def testMaster(self):
259 8235fe04 Michael Hanselmann
    node = objects.Node(name="node1")
260 8235fe04 Michael Hanselmann
    self.assertEqual(query._GetNodeRole(node, "node1"), "M")
261 8235fe04 Michael Hanselmann
262 8235fe04 Michael Hanselmann
  def testMasterCandidate(self):
263 8235fe04 Michael Hanselmann
    node = objects.Node(name="node1", master_candidate=True)
264 8235fe04 Michael Hanselmann
    self.assertEqual(query._GetNodeRole(node, "master"), "C")
265 8235fe04 Michael Hanselmann
266 8235fe04 Michael Hanselmann
  def testRegular(self):
267 8235fe04 Michael Hanselmann
    node = objects.Node(name="node1")
268 8235fe04 Michael Hanselmann
    self.assertEqual(query._GetNodeRole(node, "master"), "R")
269 8235fe04 Michael Hanselmann
270 8235fe04 Michael Hanselmann
  def testDrained(self):
271 8235fe04 Michael Hanselmann
    node = objects.Node(name="node1", drained=True)
272 8235fe04 Michael Hanselmann
    self.assertEqual(query._GetNodeRole(node, "master"), "D")
273 8235fe04 Michael Hanselmann
274 8235fe04 Michael Hanselmann
  def testOffline(self):
275 8235fe04 Michael Hanselmann
    node = objects.Node(name="node1", offline=True)
276 8235fe04 Michael Hanselmann
    self.assertEqual(query._GetNodeRole(node, "master"), "O")
277 8235fe04 Michael Hanselmann
278 8235fe04 Michael Hanselmann
279 8235fe04 Michael Hanselmann
class TestNodeQuery(unittest.TestCase):
280 8235fe04 Michael Hanselmann
  def _Create(self, selected):
281 8235fe04 Michael Hanselmann
    return query.Query(query.NODE_FIELDS, selected)
282 8235fe04 Michael Hanselmann
283 8235fe04 Michael Hanselmann
  def testSimple(self):
284 8235fe04 Michael Hanselmann
    nodes = [
285 8235fe04 Michael Hanselmann
      objects.Node(name="node1", drained=False),
286 8235fe04 Michael Hanselmann
      objects.Node(name="node2", drained=True),
287 8235fe04 Michael Hanselmann
      objects.Node(name="node3", drained=False),
288 8235fe04 Michael Hanselmann
      ]
289 8235fe04 Michael Hanselmann
    for live_data in [None, dict.fromkeys([node.name for node in nodes], {})]:
290 8235fe04 Michael Hanselmann
      nqd = query.NodeQueryData(nodes, live_data, None, None, None, None)
291 8235fe04 Michael Hanselmann
292 8235fe04 Michael Hanselmann
      q = self._Create(["name", "drained"])
293 8235fe04 Michael Hanselmann
      self.assertEqual(q.RequestedData(), set([query.NQ_CONFIG]))
294 8235fe04 Michael Hanselmann
      self.assertEqual(q.Query(nqd),
295 8235fe04 Michael Hanselmann
                       [[(constants.QRFS_NORMAL, "node1"),
296 8235fe04 Michael Hanselmann
                         (constants.QRFS_NORMAL, False)],
297 8235fe04 Michael Hanselmann
                        [(constants.QRFS_NORMAL, "node2"),
298 8235fe04 Michael Hanselmann
                         (constants.QRFS_NORMAL, True)],
299 8235fe04 Michael Hanselmann
                        [(constants.QRFS_NORMAL, "node3"),
300 8235fe04 Michael Hanselmann
                         (constants.QRFS_NORMAL, False)],
301 8235fe04 Michael Hanselmann
                       ])
302 8235fe04 Michael Hanselmann
      self.assertEqual(q.OldStyleQuery(nqd),
303 8235fe04 Michael Hanselmann
                       [["node1", False],
304 8235fe04 Michael Hanselmann
                        ["node2", True],
305 8235fe04 Michael Hanselmann
                        ["node3", False]])
306 8235fe04 Michael Hanselmann
307 8235fe04 Michael Hanselmann
  def test(self):
308 8235fe04 Michael Hanselmann
    selected = query.NODE_FIELDS.keys()
309 8235fe04 Michael Hanselmann
    field_index = dict((field, idx) for idx, field in enumerate(selected))
310 8235fe04 Michael Hanselmann
311 8235fe04 Michael Hanselmann
    q = self._Create(selected)
312 8235fe04 Michael Hanselmann
    self.assertEqual(q.RequestedData(),
313 8235fe04 Michael Hanselmann
                     set([query.NQ_CONFIG, query.NQ_LIVE, query.NQ_INST,
314 8235fe04 Michael Hanselmann
                          query.NQ_GROUP]))
315 8235fe04 Michael Hanselmann
316 8235fe04 Michael Hanselmann
    node_names = ["node%s" % i for i in range(20)]
317 8235fe04 Michael Hanselmann
    master_name = node_names[3]
318 8235fe04 Michael Hanselmann
    nodes = [
319 8235fe04 Michael Hanselmann
      objects.Node(name=name,
320 8235fe04 Michael Hanselmann
                   primary_ip="192.0.2.%s" % idx,
321 8235fe04 Michael Hanselmann
                   secondary_ip="192.0.100.%s" % idx,
322 8235fe04 Michael Hanselmann
                   serial_no=7789 * idx,
323 8235fe04 Michael Hanselmann
                   master_candidate=(name != master_name and idx % 3 == 0),
324 8235fe04 Michael Hanselmann
                   offline=False,
325 8235fe04 Michael Hanselmann
                   drained=False,
326 8235fe04 Michael Hanselmann
                   vm_capable=False,
327 8235fe04 Michael Hanselmann
                   master_capable=False,
328 8235fe04 Michael Hanselmann
                   group="default",
329 8235fe04 Michael Hanselmann
                   ctime=1290006900,
330 8235fe04 Michael Hanselmann
                   mtime=1290006913,
331 8235fe04 Michael Hanselmann
                   uuid="fd9ccebe-6339-43c9-a82e-94bbe575%04d" % idx)
332 8235fe04 Michael Hanselmann
      for idx, name in enumerate(node_names)
333 8235fe04 Michael Hanselmann
      ]
334 8235fe04 Michael Hanselmann
335 8235fe04 Michael Hanselmann
    master_node = nodes[3]
336 8235fe04 Michael Hanselmann
    master_node.AddTag("masternode")
337 8235fe04 Michael Hanselmann
    master_node.AddTag("another")
338 8235fe04 Michael Hanselmann
    master_node.AddTag("tag")
339 8235fe04 Michael Hanselmann
    assert master_node.name == master_name
340 8235fe04 Michael Hanselmann
341 8235fe04 Michael Hanselmann
    live_data_name = node_names[4]
342 8235fe04 Michael Hanselmann
    assert live_data_name != master_name
343 8235fe04 Michael Hanselmann
344 8235fe04 Michael Hanselmann
    fake_live_data = {
345 8235fe04 Michael Hanselmann
      "bootid": "a2504766-498e-4b25-b21e-d23098dc3af4",
346 8235fe04 Michael Hanselmann
      "cnodes": 4,
347 8235fe04 Michael Hanselmann
      "csockets": 4,
348 8235fe04 Michael Hanselmann
      "ctotal": 8,
349 8235fe04 Michael Hanselmann
      "mnode": 128,
350 8235fe04 Michael Hanselmann
      "mfree": 100,
351 8235fe04 Michael Hanselmann
      "mtotal": 4096,
352 8235fe04 Michael Hanselmann
      "dfree": 5 * 1024 * 1024,
353 8235fe04 Michael Hanselmann
      "dtotal": 100 * 1024 * 1024,
354 8235fe04 Michael Hanselmann
      }
355 8235fe04 Michael Hanselmann
356 8235fe04 Michael Hanselmann
    assert (sorted(query._NODE_LIVE_FIELDS.keys()) ==
357 8235fe04 Michael Hanselmann
            sorted(fake_live_data.keys()))
358 8235fe04 Michael Hanselmann
359 8235fe04 Michael Hanselmann
    live_data = dict.fromkeys(node_names, {})
360 8235fe04 Michael Hanselmann
    live_data[live_data_name] = \
361 8235fe04 Michael Hanselmann
      dict((query._NODE_LIVE_FIELDS[name][2], value)
362 8235fe04 Michael Hanselmann
           for name, value in fake_live_data.items())
363 8235fe04 Michael Hanselmann
364 8235fe04 Michael Hanselmann
    node_to_primary = dict((name, set()) for name in node_names)
365 8235fe04 Michael Hanselmann
    node_to_primary[master_name].update(["inst1", "inst2"])
366 8235fe04 Michael Hanselmann
367 8235fe04 Michael Hanselmann
    node_to_secondary = dict((name, set()) for name in node_names)
368 8235fe04 Michael Hanselmann
    node_to_secondary[live_data_name].update(["instX", "instY", "instZ"])
369 8235fe04 Michael Hanselmann
370 8235fe04 Michael Hanselmann
    ng_uuid = "492b4b74-8670-478a-b98d-4c53a76238e6"
371 8235fe04 Michael Hanselmann
    groups = {
372 8235fe04 Michael Hanselmann
      ng_uuid: objects.NodeGroup(name="ng1", uuid=ng_uuid),
373 8235fe04 Michael Hanselmann
      }
374 8235fe04 Michael Hanselmann
375 8235fe04 Michael Hanselmann
    master_node.group = ng_uuid
376 8235fe04 Michael Hanselmann
377 8235fe04 Michael Hanselmann
    nqd = query.NodeQueryData(nodes, live_data, master_name,
378 8235fe04 Michael Hanselmann
                              node_to_primary, node_to_secondary, groups)
379 8235fe04 Michael Hanselmann
    result = q.Query(nqd)
380 8235fe04 Michael Hanselmann
    self.assert_(compat.all(len(row) == len(selected) for row in result))
381 8235fe04 Michael Hanselmann
    self.assertEqual([row[field_index["name"]] for row in result],
382 8235fe04 Michael Hanselmann
                     [(constants.QRFS_NORMAL, name) for name in node_names])
383 8235fe04 Michael Hanselmann
384 8235fe04 Michael Hanselmann
    node_to_row = dict((row[field_index["name"]][1], idx)
385 8235fe04 Michael Hanselmann
                       for idx, row in enumerate(result))
386 8235fe04 Michael Hanselmann
387 8235fe04 Michael Hanselmann
    master_row = result[node_to_row[master_name]]
388 8235fe04 Michael Hanselmann
    self.assert_(master_row[field_index["master"]])
389 8235fe04 Michael Hanselmann
    self.assert_(master_row[field_index["role"]], "M")
390 8235fe04 Michael Hanselmann
    self.assertEqual(master_row[field_index["group"]],
391 8235fe04 Michael Hanselmann
                     (constants.QRFS_NORMAL, "ng1"))
392 8235fe04 Michael Hanselmann
    self.assertEqual(master_row[field_index["group.uuid"]],
393 8235fe04 Michael Hanselmann
                     (constants.QRFS_NORMAL, ng_uuid))
394 8235fe04 Michael Hanselmann
395 8235fe04 Michael Hanselmann
    self.assert_(row[field_index["pip"]] == node.primary_ip and
396 8235fe04 Michael Hanselmann
                 row[field_index["sip"]] == node.secondary_ip and
397 8235fe04 Michael Hanselmann
                 set(row[field_index["tags"]]) == node.GetTags() and
398 8235fe04 Michael Hanselmann
                 row[field_index["serial_no"]] == node.serial_no and
399 8235fe04 Michael Hanselmann
                 row[field_index["role"]] == query._GetNodeRole(node,
400 8235fe04 Michael Hanselmann
                                                                master_name) and
401 8235fe04 Michael Hanselmann
                 (node.name == master_name or
402 8235fe04 Michael Hanselmann
                  (row[field_index["group"]] == "<unknown>" and
403 8235fe04 Michael Hanselmann
                   row[field_index["group.uuid"]] is None))
404 8235fe04 Michael Hanselmann
                 for row, node in zip(result, nodes))
405 8235fe04 Michael Hanselmann
406 8235fe04 Michael Hanselmann
    live_data_row = result[node_to_row[live_data_name]]
407 8235fe04 Michael Hanselmann
408 8235fe04 Michael Hanselmann
    for (field, value) in fake_live_data.items():
409 8235fe04 Michael Hanselmann
      self.assertEqual(live_data_row[field_index[field]],
410 8235fe04 Michael Hanselmann
                       (constants.QRFS_NORMAL, value))
411 8235fe04 Michael Hanselmann
412 8235fe04 Michael Hanselmann
    self.assertEqual(master_row[field_index["pinst_cnt"]],
413 8235fe04 Michael Hanselmann
                     (constants.QRFS_NORMAL, 2))
414 8235fe04 Michael Hanselmann
    self.assertEqual(live_data_row[field_index["sinst_cnt"]],
415 8235fe04 Michael Hanselmann
                     (constants.QRFS_NORMAL, 3))
416 8235fe04 Michael Hanselmann
    self.assertEqual(master_row[field_index["pinst_list"]],
417 8235fe04 Michael Hanselmann
                     (constants.QRFS_NORMAL,
418 8235fe04 Michael Hanselmann
                      list(node_to_primary[master_name])))
419 8235fe04 Michael Hanselmann
    self.assertEqual(live_data_row[field_index["sinst_list"]],
420 8235fe04 Michael Hanselmann
                     (constants.QRFS_NORMAL,
421 8235fe04 Michael Hanselmann
                      list(node_to_secondary[live_data_name])))
422 8235fe04 Michael Hanselmann
423 8235fe04 Michael Hanselmann
  def testGetLiveNodeField(self):
424 8235fe04 Michael Hanselmann
    nodes = [
425 8235fe04 Michael Hanselmann
      objects.Node(name="node1", drained=False),
426 8235fe04 Michael Hanselmann
      objects.Node(name="node2", drained=True),
427 8235fe04 Michael Hanselmann
      objects.Node(name="node3", drained=False),
428 8235fe04 Michael Hanselmann
      ]
429 8235fe04 Michael Hanselmann
    live_data = dict.fromkeys([node.name for node in nodes], {})
430 8235fe04 Michael Hanselmann
431 8235fe04 Michael Hanselmann
    # No data
432 8235fe04 Michael Hanselmann
    nqd = query.NodeQueryData(None, None, None, None, None, None)
433 8235fe04 Michael Hanselmann
    self.assertEqual(query._GetLiveNodeField("hello", constants.QFT_NUMBER,
434 8235fe04 Michael Hanselmann
                                             nqd, None),
435 8235fe04 Michael Hanselmann
                     (constants.QRFS_NODATA, None))
436 8235fe04 Michael Hanselmann
437 8235fe04 Michael Hanselmann
    # Missing field
438 8235fe04 Michael Hanselmann
    ctx = _QueryData(None, curlive_data={
439 8235fe04 Michael Hanselmann
      "some": 1,
440 8235fe04 Michael Hanselmann
      "other": 2,
441 8235fe04 Michael Hanselmann
      })
442 8235fe04 Michael Hanselmann
    self.assertEqual(query._GetLiveNodeField("hello", constants.QFT_NUMBER,
443 8235fe04 Michael Hanselmann
                                             ctx, None),
444 8235fe04 Michael Hanselmann
                     (constants.QRFS_UNAVAIL, None))
445 8235fe04 Michael Hanselmann
446 8235fe04 Michael Hanselmann
    # Wrong format/datatype
447 8235fe04 Michael Hanselmann
    ctx = _QueryData(None, curlive_data={
448 8235fe04 Michael Hanselmann
      "hello": ["Hello World"],
449 8235fe04 Michael Hanselmann
      "other": 2,
450 8235fe04 Michael Hanselmann
      })
451 8235fe04 Michael Hanselmann
    self.assertEqual(query._GetLiveNodeField("hello", constants.QFT_NUMBER,
452 8235fe04 Michael Hanselmann
                                             ctx, None),
453 8235fe04 Michael Hanselmann
                     (constants.QRFS_UNAVAIL, None))
454 8235fe04 Michael Hanselmann
455 8235fe04 Michael Hanselmann
    # Wrong field type
456 8235fe04 Michael Hanselmann
    ctx = _QueryData(None, curlive_data={"hello": 123})
457 8235fe04 Michael Hanselmann
    self.assertRaises(AssertionError, query._GetLiveNodeField,
458 8235fe04 Michael Hanselmann
                      "hello", constants.QFT_BOOL, ctx, None)
459 8235fe04 Michael Hanselmann
460 8235fe04 Michael Hanselmann
461 4ca96421 Michael Hanselmann
if __name__ == "__main__":
462 4ca96421 Michael Hanselmann
  testutils.GanetiTestProgram()