Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.query_unittest.py @ 79b2ca83

History | View | Annotate | Download (36.3 kB)

1 4ca96421 Michael Hanselmann
#!/usr/bin/python
2 4ca96421 Michael Hanselmann
#
3 4ca96421 Michael Hanselmann
4 e2d188cc Iustin Pop
# Copyright (C) 2010, 2011 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 aa29e95f Michael Hanselmann
import random
27 4ca96421 Michael Hanselmann
28 4ca96421 Michael Hanselmann
from ganeti import constants
29 4ca96421 Michael Hanselmann
from ganeti import utils
30 4ca96421 Michael Hanselmann
from ganeti import compat
31 4ca96421 Michael Hanselmann
from ganeti import errors
32 4ca96421 Michael Hanselmann
from ganeti import query
33 4ca96421 Michael Hanselmann
from ganeti import objects
34 1c8addc6 Michael Hanselmann
from ganeti import cmdlib
35 4ca96421 Michael Hanselmann
36 4ca96421 Michael Hanselmann
import testutils
37 4ca96421 Michael Hanselmann
38 4ca96421 Michael Hanselmann
39 4ca96421 Michael Hanselmann
class TestConstants(unittest.TestCase):
40 4ca96421 Michael Hanselmann
  def test(self):
41 4ca96421 Michael Hanselmann
    self.assertEqual(set(query._VERIFY_FN.keys()),
42 4ca96421 Michael Hanselmann
                     constants.QFT_ALL)
43 4ca96421 Michael Hanselmann
44 4ca96421 Michael Hanselmann
45 4ca96421 Michael Hanselmann
class _QueryData:
46 4ca96421 Michael Hanselmann
  def __init__(self, data, **kwargs):
47 4ca96421 Michael Hanselmann
    self.data = data
48 4ca96421 Michael Hanselmann
49 4ca96421 Michael Hanselmann
    for name, value in kwargs.items():
50 4ca96421 Michael Hanselmann
      setattr(self, name, value)
51 4ca96421 Michael Hanselmann
52 4ca96421 Michael Hanselmann
  def __iter__(self):
53 4ca96421 Michael Hanselmann
    return iter(self.data)
54 4ca96421 Michael Hanselmann
55 4ca96421 Michael Hanselmann
56 4ca96421 Michael Hanselmann
def _GetDiskSize(nr, ctx, item):
57 4ca96421 Michael Hanselmann
  disks = item["disks"]
58 4ca96421 Michael Hanselmann
  try:
59 e2d188cc Iustin Pop
    return disks[nr]
60 4ca96421 Michael Hanselmann
  except IndexError:
61 e2d188cc Iustin Pop
    return query._FS_UNAVAIL
62 4ca96421 Michael Hanselmann
63 4ca96421 Michael Hanselmann
64 4ca96421 Michael Hanselmann
class TestQuery(unittest.TestCase):
65 4ca96421 Michael Hanselmann
  def test(self):
66 4ca96421 Michael Hanselmann
    (STATIC, DISK) = range(10, 12)
67 4ca96421 Michael Hanselmann
68 4ca96421 Michael Hanselmann
    fielddef = query._PrepareFieldList([
69 79b2ca83 Michael Hanselmann
      (query._MakeField("name", "Name", constants.QFT_TEXT, "Name"),
70 e2d188cc Iustin Pop
       STATIC, lambda ctx, item: item["name"]),
71 79b2ca83 Michael Hanselmann
      (query._MakeField("master", "Master", constants.QFT_BOOL, "Master"),
72 e2d188cc Iustin Pop
       STATIC, lambda ctx, item: ctx.mastername == item["name"]),
73 4ca96421 Michael Hanselmann
      ] +
74 4ca96421 Michael Hanselmann
      [(query._MakeField("disk%s.size" % i, "DiskSize%s" % i,
75 79b2ca83 Michael Hanselmann
                         constants.QFT_UNIT, "Disk size %s" % i),
76 4ca96421 Michael Hanselmann
        DISK, compat.partial(_GetDiskSize, i))
77 d63bd540 Iustin Pop
       for i in range(4)], [])
78 4ca96421 Michael Hanselmann
79 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["name"])
80 4ca96421 Michael Hanselmann
    self.assertEqual(q.RequestedData(), set([STATIC]))
81 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 1)
82 4ca96421 Michael Hanselmann
    self.assertEqual(len(q.GetFields()), 1)
83 4ca96421 Michael Hanselmann
    self.assertEqual(q.GetFields()[0].ToDict(),
84 4ca96421 Michael Hanselmann
      objects.QueryFieldDefinition(name="name",
85 4ca96421 Michael Hanselmann
                                   title="Name",
86 79b2ca83 Michael Hanselmann
                                   kind=constants.QFT_TEXT,
87 79b2ca83 Michael Hanselmann
                                   doc="Name").ToDict())
88 4ca96421 Michael Hanselmann
89 4ca96421 Michael Hanselmann
    # Create data only once query has been prepared
90 4ca96421 Michael Hanselmann
    data = [
91 4ca96421 Michael Hanselmann
      { "name": "node1", "disks": [0, 1, 2], },
92 4ca96421 Michael Hanselmann
      { "name": "node2", "disks": [3, 4], },
93 4ca96421 Michael Hanselmann
      { "name": "node3", "disks": [5, 6, 7], },
94 4ca96421 Michael Hanselmann
      ]
95 4ca96421 Michael Hanselmann
96 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(data, mastername="node3")),
97 cfb084ae René Nussbaumer
                     [[(constants.RS_NORMAL, "node1")],
98 cfb084ae René Nussbaumer
                      [(constants.RS_NORMAL, "node2")],
99 cfb084ae René Nussbaumer
                      [(constants.RS_NORMAL, "node3")]])
100 4ca96421 Michael Hanselmann
    self.assertEqual(q.OldStyleQuery(_QueryData(data, mastername="node3")),
101 4ca96421 Michael Hanselmann
                     [["node1"], ["node2"], ["node3"]])
102 4ca96421 Michael Hanselmann
103 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["name", "master"])
104 4ca96421 Michael Hanselmann
    self.assertEqual(q.RequestedData(), set([STATIC]))
105 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 2)
106 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(data, mastername="node3")),
107 cfb084ae René Nussbaumer
                     [[(constants.RS_NORMAL, "node1"),
108 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, False)],
109 cfb084ae René Nussbaumer
                      [(constants.RS_NORMAL, "node2"),
110 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, False)],
111 cfb084ae René Nussbaumer
                      [(constants.RS_NORMAL, "node3"),
112 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, True)],
113 4ca96421 Michael Hanselmann
                     ])
114 4ca96421 Michael Hanselmann
115 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["name", "master", "disk0.size"])
116 4ca96421 Michael Hanselmann
    self.assertEqual(q.RequestedData(), set([STATIC, DISK]))
117 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 3)
118 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(data, mastername="node2")),
119 cfb084ae René Nussbaumer
                     [[(constants.RS_NORMAL, "node1"),
120 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, False),
121 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 0)],
122 cfb084ae René Nussbaumer
                      [(constants.RS_NORMAL, "node2"),
123 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, True),
124 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 3)],
125 cfb084ae René Nussbaumer
                      [(constants.RS_NORMAL, "node3"),
126 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, False),
127 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 5)],
128 4ca96421 Michael Hanselmann
                     ])
129 4ca96421 Michael Hanselmann
130 4ca96421 Michael Hanselmann
    # With unknown column
131 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["disk2.size", "disk1.size", "disk99.size",
132 4ca96421 Michael Hanselmann
                               "disk0.size"])
133 4ca96421 Michael Hanselmann
    self.assertEqual(q.RequestedData(), set([DISK]))
134 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 4)
135 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(data, mastername="node2")),
136 cfb084ae René Nussbaumer
                     [[(constants.RS_NORMAL, 2),
137 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 1),
138 cfb084ae René Nussbaumer
                       (constants.RS_UNKNOWN, None),
139 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 0)],
140 cfb084ae René Nussbaumer
                      [(constants.RS_UNAVAIL, None),
141 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 4),
142 cfb084ae René Nussbaumer
                       (constants.RS_UNKNOWN, None),
143 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 3)],
144 cfb084ae René Nussbaumer
                      [(constants.RS_NORMAL, 7),
145 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 6),
146 cfb084ae René Nussbaumer
                       (constants.RS_UNKNOWN, None),
147 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 5)],
148 4ca96421 Michael Hanselmann
                     ])
149 4ca96421 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, q.OldStyleQuery,
150 4ca96421 Michael Hanselmann
                      _QueryData(data, mastername="node2"))
151 4ca96421 Michael Hanselmann
    self.assertEqual([fdef.ToDict() for fdef in q.GetFields()], [
152 4ca96421 Michael Hanselmann
                     { "name": "disk2.size", "title": "DiskSize2",
153 79b2ca83 Michael Hanselmann
                       "kind": constants.QFT_UNIT, "doc": "Disk size 2", },
154 4ca96421 Michael Hanselmann
                     { "name": "disk1.size", "title": "DiskSize1",
155 79b2ca83 Michael Hanselmann
                       "kind": constants.QFT_UNIT, "doc": "Disk size 1", },
156 4ca96421 Michael Hanselmann
                     { "name": "disk99.size", "title": "disk99.size",
157 79b2ca83 Michael Hanselmann
                       "kind": constants.QFT_UNKNOWN,
158 79b2ca83 Michael Hanselmann
                       "doc": "Unknown field 'disk99.size'", },
159 4ca96421 Michael Hanselmann
                     { "name": "disk0.size", "title": "DiskSize0",
160 79b2ca83 Michael Hanselmann
                       "kind": constants.QFT_UNIT, "doc": "Disk size 0", },
161 4ca96421 Michael Hanselmann
                     ])
162 4ca96421 Michael Hanselmann
163 4ca96421 Michael Hanselmann
    # Empty query
164 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, [])
165 4ca96421 Michael Hanselmann
    self.assertEqual(q.RequestedData(), set([]))
166 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 0)
167 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(data, mastername="node2")),
168 4ca96421 Michael Hanselmann
                     [[], [], []])
169 4ca96421 Michael Hanselmann
    self.assertEqual(q.OldStyleQuery(_QueryData(data, mastername="node2")),
170 4ca96421 Michael Hanselmann
                     [[], [], []])
171 4ca96421 Michael Hanselmann
    self.assertEqual(q.GetFields(), [])
172 4ca96421 Michael Hanselmann
173 4ca96421 Michael Hanselmann
  def testPrepareFieldList(self):
174 4ca96421 Michael Hanselmann
    # Duplicate titles
175 4ca96421 Michael Hanselmann
    for (a, b) in [("name", "name"), ("NAME", "name")]:
176 4ca96421 Michael Hanselmann
      self.assertRaises(AssertionError, query._PrepareFieldList, [
177 79b2ca83 Michael Hanselmann
        (query._MakeField("name", b, constants.QFT_TEXT, "Name"), None,
178 4ca96421 Michael Hanselmann
         lambda *args: None),
179 79b2ca83 Michael Hanselmann
        (query._MakeField("other", a, constants.QFT_TEXT, "Other"), None,
180 4ca96421 Michael Hanselmann
         lambda *args: None),
181 d63bd540 Iustin Pop
        ], [])
182 4ca96421 Michael Hanselmann
183 4ca96421 Michael Hanselmann
    # Non-lowercase names
184 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
185 79b2ca83 Michael Hanselmann
      (query._MakeField("NAME", "Name", constants.QFT_TEXT, "Name"), None,
186 4ca96421 Michael Hanselmann
       lambda *args: None),
187 d63bd540 Iustin Pop
      ], [])
188 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
189 79b2ca83 Michael Hanselmann
      (query._MakeField("Name", "Name", constants.QFT_TEXT, "Name"), None,
190 4ca96421 Michael Hanselmann
       lambda *args: None),
191 d63bd540 Iustin Pop
      ], [])
192 4ca96421 Michael Hanselmann
193 4ca96421 Michael Hanselmann
    # Empty name
194 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
195 79b2ca83 Michael Hanselmann
      (query._MakeField("", "Name", constants.QFT_TEXT, "Name"), None,
196 4ca96421 Michael Hanselmann
       lambda *args: None),
197 d63bd540 Iustin Pop
      ], [])
198 4ca96421 Michael Hanselmann
199 4ca96421 Michael Hanselmann
    # Empty title
200 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
201 79b2ca83 Michael Hanselmann
      (query._MakeField("name", "", constants.QFT_TEXT, "Name"), None,
202 4ca96421 Michael Hanselmann
       lambda *args: None),
203 d63bd540 Iustin Pop
      ], [])
204 4ca96421 Michael Hanselmann
205 4ca96421 Michael Hanselmann
    # Whitespace in title
206 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
207 79b2ca83 Michael Hanselmann
      (query._MakeField("name", "Co lu mn", constants.QFT_TEXT, "Name"), None,
208 4ca96421 Michael Hanselmann
       lambda *args: None),
209 d63bd540 Iustin Pop
      ], [])
210 4ca96421 Michael Hanselmann
211 4ca96421 Michael Hanselmann
    # No callable function
212 4ca96421 Michael Hanselmann
    self.assertRaises(AssertionError, query._PrepareFieldList, [
213 79b2ca83 Michael Hanselmann
      (query._MakeField("name", "Name", constants.QFT_TEXT, "Name"),
214 79b2ca83 Michael Hanselmann
       None, None),
215 d63bd540 Iustin Pop
      ], [])
216 4ca96421 Michael Hanselmann
217 79b2ca83 Michael Hanselmann
    # Invalid documentation
218 79b2ca83 Michael Hanselmann
    for doc in ["", ".", "Hello world\n", "Hello\nWo\nrld", "Hello World!",
219 79b2ca83 Michael Hanselmann
                "HelloWorld.", "only lowercase", ",", " x y z .\t", "  "]:
220 79b2ca83 Michael Hanselmann
      self.assertRaises(AssertionError, query._PrepareFieldList, [
221 79b2ca83 Michael Hanselmann
        (query._MakeField("name", "Name", constants.QFT_TEXT, doc),
222 79b2ca83 Michael Hanselmann
        None, lambda *args: None),
223 79b2ca83 Michael Hanselmann
        ], [])
224 79b2ca83 Michael Hanselmann
225 4ca96421 Michael Hanselmann
  def testUnknown(self):
226 4ca96421 Michael Hanselmann
    fielddef = query._PrepareFieldList([
227 79b2ca83 Michael Hanselmann
      (query._MakeField("name", "Name", constants.QFT_TEXT, "Name"),
228 e2d188cc Iustin Pop
       None, lambda _, item: "name%s" % item),
229 79b2ca83 Michael Hanselmann
      (query._MakeField("other0", "Other0", constants.QFT_TIMESTAMP, "Other"),
230 e2d188cc Iustin Pop
       None, lambda *args: 1234),
231 79b2ca83 Michael Hanselmann
      (query._MakeField("nodata", "NoData", constants.QFT_NUMBER, "No data"),
232 e2d188cc Iustin Pop
       None, lambda *args: query._FS_NODATA ),
233 79b2ca83 Michael Hanselmann
      (query._MakeField("unavail", "Unavail", constants.QFT_BOOL, "Unavail"),
234 e2d188cc Iustin Pop
       None, lambda *args: query._FS_UNAVAIL),
235 d63bd540 Iustin Pop
      ], [])
236 4ca96421 Michael Hanselmann
237 4ca96421 Michael Hanselmann
    for selected in [["foo"], ["Hello", "World"],
238 4ca96421 Michael Hanselmann
                     ["name1", "other", "foo"]]:
239 4ca96421 Michael Hanselmann
      q = query.Query(fielddef, selected)
240 4ca96421 Michael Hanselmann
      self.assertEqual(len(q._fields), len(selected))
241 4ca96421 Michael Hanselmann
      self.assert_(compat.all(len(row) == len(selected)
242 4ca96421 Michael Hanselmann
                              for row in q.Query(_QueryData(range(1, 10)))))
243 4ca96421 Michael Hanselmann
      self.assertEqual(q.Query(_QueryData(range(1, 10))),
244 cfb084ae René Nussbaumer
                       [[(constants.RS_UNKNOWN, None)] * len(selected)
245 4ca96421 Michael Hanselmann
                        for i in range(1, 10)])
246 4ca96421 Michael Hanselmann
      self.assertEqual([fdef.ToDict() for fdef in q.GetFields()],
247 4ca96421 Michael Hanselmann
                       [{ "name": name, "title": name,
248 79b2ca83 Michael Hanselmann
                          "kind": constants.QFT_UNKNOWN,
249 79b2ca83 Michael Hanselmann
                          "doc": "Unknown field '%s'" % name}
250 4ca96421 Michael Hanselmann
                        for name in selected])
251 4ca96421 Michael Hanselmann
252 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["name", "other0", "nodata", "unavail"])
253 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 4)
254 4ca96421 Michael Hanselmann
    self.assertEqual(q.OldStyleQuery(_QueryData(range(1, 10))), [
255 4ca96421 Michael Hanselmann
                     ["name%s" % i, 1234, None, None]
256 4ca96421 Michael Hanselmann
                     for i in range(1, 10)
257 4ca96421 Michael Hanselmann
                     ])
258 4ca96421 Michael Hanselmann
259 4ca96421 Michael Hanselmann
    q = query.Query(fielddef, ["name", "other0", "nodata", "unavail", "unk"])
260 4ca96421 Michael Hanselmann
    self.assertEqual(len(q._fields), 5)
261 4ca96421 Michael Hanselmann
    self.assertEqual(q.Query(_QueryData(range(1, 10))),
262 cfb084ae René Nussbaumer
                     [[(constants.RS_NORMAL, "name%s" % i),
263 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 1234),
264 cfb084ae René Nussbaumer
                       (constants.RS_NODATA, None),
265 cfb084ae René Nussbaumer
                       (constants.RS_UNAVAIL, None),
266 cfb084ae René Nussbaumer
                       (constants.RS_UNKNOWN, None)]
267 4ca96421 Michael Hanselmann
                      for i in range(1, 10)])
268 4ca96421 Michael Hanselmann
269 d63bd540 Iustin Pop
  def testAliases(self):
270 d63bd540 Iustin Pop
    fields = [
271 79b2ca83 Michael Hanselmann
      (query._MakeField("a", "a-title", constants.QFT_TEXT, "Field A"), None,
272 d63bd540 Iustin Pop
       lambda *args: None),
273 79b2ca83 Michael Hanselmann
      (query._MakeField("b", "b-title", constants.QFT_TEXT, "Field B"), None,
274 d63bd540 Iustin Pop
       lambda *args: None),
275 d63bd540 Iustin Pop
      ]
276 d63bd540 Iustin Pop
    # duplicate field
277 d63bd540 Iustin Pop
    self.assertRaises(AssertionError, query._PrepareFieldList, fields,
278 d63bd540 Iustin Pop
                      [("b", "a")])
279 d63bd540 Iustin Pop
    self.assertRaises(AssertionError, query._PrepareFieldList, fields,
280 d63bd540 Iustin Pop
                      [("c", "b"), ("c", "a")])
281 d63bd540 Iustin Pop
    # missing target
282 d63bd540 Iustin Pop
    self.assertRaises(AssertionError, query._PrepareFieldList, fields,
283 d63bd540 Iustin Pop
                      [("c", "d")])
284 d63bd540 Iustin Pop
    fdefs = query._PrepareFieldList(fields, [("c", "b")])
285 d63bd540 Iustin Pop
    self.assertEqual(len(fdefs), 3)
286 d63bd540 Iustin Pop
    self.assertEqual(fdefs["b"][1:], fdefs["c"][1:])
287 d63bd540 Iustin Pop
288 4ca96421 Michael Hanselmann
289 8235fe04 Michael Hanselmann
class TestGetNodeRole(unittest.TestCase):
290 1e28e3b8 Michael Hanselmann
  def test(self):
291 1e28e3b8 Michael Hanselmann
    tested_role = set()
292 1e28e3b8 Michael Hanselmann
293 1e28e3b8 Michael Hanselmann
    checks = [
294 1e28e3b8 Michael Hanselmann
      (constants.NR_MASTER, "node1", objects.Node(name="node1")),
295 1e28e3b8 Michael Hanselmann
      (constants.NR_MCANDIDATE, "master",
296 1e28e3b8 Michael Hanselmann
       objects.Node(name="node1", master_candidate=True)),
297 1e28e3b8 Michael Hanselmann
      (constants.NR_REGULAR, "master", objects.Node(name="node1")),
298 1e28e3b8 Michael Hanselmann
      (constants.NR_DRAINED, "master",
299 1e28e3b8 Michael Hanselmann
       objects.Node(name="node1", drained=True)),
300 1e28e3b8 Michael Hanselmann
      (constants.NR_OFFLINE,
301 1e28e3b8 Michael Hanselmann
       "master", objects.Node(name="node1", offline=True)),
302 1e28e3b8 Michael Hanselmann
      ]
303 8235fe04 Michael Hanselmann
304 1e28e3b8 Michael Hanselmann
    for (role, master_name, node) in checks:
305 1e28e3b8 Michael Hanselmann
      result = query._GetNodeRole(node, master_name)
306 1e28e3b8 Michael Hanselmann
      self.assertEqual(result, role)
307 1e28e3b8 Michael Hanselmann
      tested_role.add(result)
308 8235fe04 Michael Hanselmann
309 1e28e3b8 Michael Hanselmann
    self.assertEqual(tested_role, constants.NR_ALL)
310 8235fe04 Michael Hanselmann
311 8235fe04 Michael Hanselmann
312 8235fe04 Michael Hanselmann
class TestNodeQuery(unittest.TestCase):
313 8235fe04 Michael Hanselmann
  def _Create(self, selected):
314 8235fe04 Michael Hanselmann
    return query.Query(query.NODE_FIELDS, selected)
315 8235fe04 Michael Hanselmann
316 8235fe04 Michael Hanselmann
  def testSimple(self):
317 8235fe04 Michael Hanselmann
    nodes = [
318 8235fe04 Michael Hanselmann
      objects.Node(name="node1", drained=False),
319 8235fe04 Michael Hanselmann
      objects.Node(name="node2", drained=True),
320 8235fe04 Michael Hanselmann
      objects.Node(name="node3", drained=False),
321 8235fe04 Michael Hanselmann
      ]
322 8235fe04 Michael Hanselmann
    for live_data in [None, dict.fromkeys([node.name for node in nodes], {})]:
323 8572f1fe René Nussbaumer
      nqd = query.NodeQueryData(nodes, live_data, None, None, None, None, None,
324 8572f1fe René Nussbaumer
                                None)
325 8235fe04 Michael Hanselmann
326 8235fe04 Michael Hanselmann
      q = self._Create(["name", "drained"])
327 8235fe04 Michael Hanselmann
      self.assertEqual(q.RequestedData(), set([query.NQ_CONFIG]))
328 8235fe04 Michael Hanselmann
      self.assertEqual(q.Query(nqd),
329 cfb084ae René Nussbaumer
                       [[(constants.RS_NORMAL, "node1"),
330 cfb084ae René Nussbaumer
                         (constants.RS_NORMAL, False)],
331 cfb084ae René Nussbaumer
                        [(constants.RS_NORMAL, "node2"),
332 cfb084ae René Nussbaumer
                         (constants.RS_NORMAL, True)],
333 cfb084ae René Nussbaumer
                        [(constants.RS_NORMAL, "node3"),
334 cfb084ae René Nussbaumer
                         (constants.RS_NORMAL, False)],
335 8235fe04 Michael Hanselmann
                       ])
336 8235fe04 Michael Hanselmann
      self.assertEqual(q.OldStyleQuery(nqd),
337 8235fe04 Michael Hanselmann
                       [["node1", False],
338 8235fe04 Michael Hanselmann
                        ["node2", True],
339 8235fe04 Michael Hanselmann
                        ["node3", False]])
340 8235fe04 Michael Hanselmann
341 8235fe04 Michael Hanselmann
  def test(self):
342 8235fe04 Michael Hanselmann
    selected = query.NODE_FIELDS.keys()
343 8235fe04 Michael Hanselmann
    field_index = dict((field, idx) for idx, field in enumerate(selected))
344 8235fe04 Michael Hanselmann
345 8235fe04 Michael Hanselmann
    q = self._Create(selected)
346 8235fe04 Michael Hanselmann
    self.assertEqual(q.RequestedData(),
347 8235fe04 Michael Hanselmann
                     set([query.NQ_CONFIG, query.NQ_LIVE, query.NQ_INST,
348 52b5d286 René Nussbaumer
                          query.NQ_GROUP, query.NQ_OOB]))
349 8235fe04 Michael Hanselmann
350 8572f1fe René Nussbaumer
    cluster = objects.Cluster(cluster_name="testcluster",
351 8572f1fe René Nussbaumer
      hvparams=constants.HVC_DEFAULTS,
352 8572f1fe René Nussbaumer
      beparams={
353 8572f1fe René Nussbaumer
        constants.PP_DEFAULT: constants.BEC_DEFAULTS,
354 8572f1fe René Nussbaumer
        },
355 8572f1fe René Nussbaumer
      nicparams={
356 8572f1fe René Nussbaumer
        constants.PP_DEFAULT: constants.NICC_DEFAULTS,
357 8572f1fe René Nussbaumer
        },
358 8572f1fe René Nussbaumer
      ndparams=constants.NDC_DEFAULTS,
359 8572f1fe René Nussbaumer
        )
360 8572f1fe René Nussbaumer
361 8235fe04 Michael Hanselmann
    node_names = ["node%s" % i for i in range(20)]
362 8235fe04 Michael Hanselmann
    master_name = node_names[3]
363 8235fe04 Michael Hanselmann
    nodes = [
364 8235fe04 Michael Hanselmann
      objects.Node(name=name,
365 8235fe04 Michael Hanselmann
                   primary_ip="192.0.2.%s" % idx,
366 8235fe04 Michael Hanselmann
                   secondary_ip="192.0.100.%s" % idx,
367 8235fe04 Michael Hanselmann
                   serial_no=7789 * idx,
368 8235fe04 Michael Hanselmann
                   master_candidate=(name != master_name and idx % 3 == 0),
369 8235fe04 Michael Hanselmann
                   offline=False,
370 8235fe04 Michael Hanselmann
                   drained=False,
371 effab4ca Iustin Pop
                   vm_capable=True,
372 8235fe04 Michael Hanselmann
                   master_capable=False,
373 8572f1fe René Nussbaumer
                   ndparams={},
374 8235fe04 Michael Hanselmann
                   group="default",
375 8235fe04 Michael Hanselmann
                   ctime=1290006900,
376 8235fe04 Michael Hanselmann
                   mtime=1290006913,
377 8235fe04 Michael Hanselmann
                   uuid="fd9ccebe-6339-43c9-a82e-94bbe575%04d" % idx)
378 8235fe04 Michael Hanselmann
      for idx, name in enumerate(node_names)
379 8235fe04 Michael Hanselmann
      ]
380 8235fe04 Michael Hanselmann
381 8235fe04 Michael Hanselmann
    master_node = nodes[3]
382 8235fe04 Michael Hanselmann
    master_node.AddTag("masternode")
383 8235fe04 Michael Hanselmann
    master_node.AddTag("another")
384 8235fe04 Michael Hanselmann
    master_node.AddTag("tag")
385 145bea54 Michael Hanselmann
    master_node.ctime = None
386 145bea54 Michael Hanselmann
    master_node.mtime = None
387 8235fe04 Michael Hanselmann
    assert master_node.name == master_name
388 8235fe04 Michael Hanselmann
389 8235fe04 Michael Hanselmann
    live_data_name = node_names[4]
390 8235fe04 Michael Hanselmann
    assert live_data_name != master_name
391 8235fe04 Michael Hanselmann
392 8235fe04 Michael Hanselmann
    fake_live_data = {
393 8235fe04 Michael Hanselmann
      "bootid": "a2504766-498e-4b25-b21e-d23098dc3af4",
394 8235fe04 Michael Hanselmann
      "cnodes": 4,
395 8235fe04 Michael Hanselmann
      "csockets": 4,
396 8235fe04 Michael Hanselmann
      "ctotal": 8,
397 8235fe04 Michael Hanselmann
      "mnode": 128,
398 8235fe04 Michael Hanselmann
      "mfree": 100,
399 8235fe04 Michael Hanselmann
      "mtotal": 4096,
400 8235fe04 Michael Hanselmann
      "dfree": 5 * 1024 * 1024,
401 8235fe04 Michael Hanselmann
      "dtotal": 100 * 1024 * 1024,
402 8235fe04 Michael Hanselmann
      }
403 8235fe04 Michael Hanselmann
404 8235fe04 Michael Hanselmann
    assert (sorted(query._NODE_LIVE_FIELDS.keys()) ==
405 8235fe04 Michael Hanselmann
            sorted(fake_live_data.keys()))
406 8235fe04 Michael Hanselmann
407 8235fe04 Michael Hanselmann
    live_data = dict.fromkeys(node_names, {})
408 8235fe04 Michael Hanselmann
    live_data[live_data_name] = \
409 8235fe04 Michael Hanselmann
      dict((query._NODE_LIVE_FIELDS[name][2], value)
410 8235fe04 Michael Hanselmann
           for name, value in fake_live_data.items())
411 8235fe04 Michael Hanselmann
412 8235fe04 Michael Hanselmann
    node_to_primary = dict((name, set()) for name in node_names)
413 8235fe04 Michael Hanselmann
    node_to_primary[master_name].update(["inst1", "inst2"])
414 8235fe04 Michael Hanselmann
415 8235fe04 Michael Hanselmann
    node_to_secondary = dict((name, set()) for name in node_names)
416 8235fe04 Michael Hanselmann
    node_to_secondary[live_data_name].update(["instX", "instY", "instZ"])
417 8235fe04 Michael Hanselmann
418 8235fe04 Michael Hanselmann
    ng_uuid = "492b4b74-8670-478a-b98d-4c53a76238e6"
419 8235fe04 Michael Hanselmann
    groups = {
420 8572f1fe René Nussbaumer
      ng_uuid: objects.NodeGroup(name="ng1", uuid=ng_uuid, ndparams={}),
421 8235fe04 Michael Hanselmann
      }
422 8235fe04 Michael Hanselmann
423 52b5d286 René Nussbaumer
    oob_support = dict((name, False) for name in node_names)
424 52b5d286 René Nussbaumer
425 8235fe04 Michael Hanselmann
    master_node.group = ng_uuid
426 8235fe04 Michael Hanselmann
427 8235fe04 Michael Hanselmann
    nqd = query.NodeQueryData(nodes, live_data, master_name,
428 52b5d286 René Nussbaumer
                              node_to_primary, node_to_secondary, groups,
429 8572f1fe René Nussbaumer
                              oob_support, cluster)
430 8235fe04 Michael Hanselmann
    result = q.Query(nqd)
431 8235fe04 Michael Hanselmann
    self.assert_(compat.all(len(row) == len(selected) for row in result))
432 8235fe04 Michael Hanselmann
    self.assertEqual([row[field_index["name"]] for row in result],
433 cfb084ae René Nussbaumer
                     [(constants.RS_NORMAL, name) for name in node_names])
434 8235fe04 Michael Hanselmann
435 8235fe04 Michael Hanselmann
    node_to_row = dict((row[field_index["name"]][1], idx)
436 8235fe04 Michael Hanselmann
                       for idx, row in enumerate(result))
437 8235fe04 Michael Hanselmann
438 8235fe04 Michael Hanselmann
    master_row = result[node_to_row[master_name]]
439 8235fe04 Michael Hanselmann
    self.assert_(master_row[field_index["master"]])
440 8235fe04 Michael Hanselmann
    self.assert_(master_row[field_index["role"]], "M")
441 8235fe04 Michael Hanselmann
    self.assertEqual(master_row[field_index["group"]],
442 cfb084ae René Nussbaumer
                     (constants.RS_NORMAL, "ng1"))
443 8235fe04 Michael Hanselmann
    self.assertEqual(master_row[field_index["group.uuid"]],
444 cfb084ae René Nussbaumer
                     (constants.RS_NORMAL, ng_uuid))
445 145bea54 Michael Hanselmann
    self.assertEqual(master_row[field_index["ctime"]],
446 cfb084ae René Nussbaumer
                     (constants.RS_UNAVAIL, None))
447 145bea54 Michael Hanselmann
    self.assertEqual(master_row[field_index["mtime"]],
448 cfb084ae René Nussbaumer
                     (constants.RS_UNAVAIL, None))
449 8235fe04 Michael Hanselmann
450 8235fe04 Michael Hanselmann
    self.assert_(row[field_index["pip"]] == node.primary_ip and
451 8235fe04 Michael Hanselmann
                 row[field_index["sip"]] == node.secondary_ip and
452 8235fe04 Michael Hanselmann
                 set(row[field_index["tags"]]) == node.GetTags() and
453 8235fe04 Michael Hanselmann
                 row[field_index["serial_no"]] == node.serial_no and
454 8235fe04 Michael Hanselmann
                 row[field_index["role"]] == query._GetNodeRole(node,
455 8235fe04 Michael Hanselmann
                                                                master_name) and
456 8235fe04 Michael Hanselmann
                 (node.name == master_name or
457 8235fe04 Michael Hanselmann
                  (row[field_index["group"]] == "<unknown>" and
458 145bea54 Michael Hanselmann
                   row[field_index["group.uuid"]] is None and
459 cfb084ae René Nussbaumer
                   row[field_index["ctime"]] == (constants.RS_NORMAL,
460 145bea54 Michael Hanselmann
                                                 node.ctime) and
461 cfb084ae René Nussbaumer
                   row[field_index["mtime"]] == (constants.RS_NORMAL,
462 145bea54 Michael Hanselmann
                                                 node.mtime)))
463 8235fe04 Michael Hanselmann
                 for row, node in zip(result, nodes))
464 8235fe04 Michael Hanselmann
465 8235fe04 Michael Hanselmann
    live_data_row = result[node_to_row[live_data_name]]
466 8235fe04 Michael Hanselmann
467 8235fe04 Michael Hanselmann
    for (field, value) in fake_live_data.items():
468 8235fe04 Michael Hanselmann
      self.assertEqual(live_data_row[field_index[field]],
469 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, value))
470 8235fe04 Michael Hanselmann
471 8235fe04 Michael Hanselmann
    self.assertEqual(master_row[field_index["pinst_cnt"]],
472 cfb084ae René Nussbaumer
                     (constants.RS_NORMAL, 2))
473 8235fe04 Michael Hanselmann
    self.assertEqual(live_data_row[field_index["sinst_cnt"]],
474 cfb084ae René Nussbaumer
                     (constants.RS_NORMAL, 3))
475 8235fe04 Michael Hanselmann
    self.assertEqual(master_row[field_index["pinst_list"]],
476 cfb084ae René Nussbaumer
                     (constants.RS_NORMAL,
477 8235fe04 Michael Hanselmann
                      list(node_to_primary[master_name])))
478 8235fe04 Michael Hanselmann
    self.assertEqual(live_data_row[field_index["sinst_list"]],
479 cfb084ae René Nussbaumer
                     (constants.RS_NORMAL,
480 8235fe04 Michael Hanselmann
                      list(node_to_secondary[live_data_name])))
481 8235fe04 Michael Hanselmann
482 8235fe04 Michael Hanselmann
  def testGetLiveNodeField(self):
483 8235fe04 Michael Hanselmann
    nodes = [
484 effab4ca Iustin Pop
      objects.Node(name="node1", drained=False, offline=False,
485 effab4ca Iustin Pop
                   vm_capable=True),
486 effab4ca Iustin Pop
      objects.Node(name="node2", drained=True, offline=False,
487 effab4ca Iustin Pop
                   vm_capable=True),
488 effab4ca Iustin Pop
      objects.Node(name="node3", drained=False, offline=False,
489 effab4ca Iustin Pop
                   vm_capable=True),
490 effab4ca Iustin Pop
      objects.Node(name="node4", drained=False, offline=True,
491 effab4ca Iustin Pop
                   vm_capable=True),
492 effab4ca Iustin Pop
      objects.Node(name="node5", drained=False, offline=False,
493 effab4ca Iustin Pop
                   vm_capable=False),
494 8235fe04 Michael Hanselmann
      ]
495 8235fe04 Michael Hanselmann
    live_data = dict.fromkeys([node.name for node in nodes], {})
496 8235fe04 Michael Hanselmann
497 8235fe04 Michael Hanselmann
    # No data
498 8572f1fe René Nussbaumer
    nqd = query.NodeQueryData(None, None, None, None, None, None, None, None)
499 8235fe04 Michael Hanselmann
    self.assertEqual(query._GetLiveNodeField("hello", constants.QFT_NUMBER,
500 a6070ef7 Michael Hanselmann
                                             nqd, nodes[0]),
501 e2d188cc Iustin Pop
                     query._FS_NODATA)
502 8235fe04 Michael Hanselmann
503 8235fe04 Michael Hanselmann
    # Missing field
504 8235fe04 Michael Hanselmann
    ctx = _QueryData(None, curlive_data={
505 8235fe04 Michael Hanselmann
      "some": 1,
506 8235fe04 Michael Hanselmann
      "other": 2,
507 8235fe04 Michael Hanselmann
      })
508 8235fe04 Michael Hanselmann
    self.assertEqual(query._GetLiveNodeField("hello", constants.QFT_NUMBER,
509 a6070ef7 Michael Hanselmann
                                             ctx, nodes[0]),
510 e2d188cc Iustin Pop
                     query._FS_UNAVAIL)
511 8235fe04 Michael Hanselmann
512 8235fe04 Michael Hanselmann
    # Wrong format/datatype
513 8235fe04 Michael Hanselmann
    ctx = _QueryData(None, curlive_data={
514 8235fe04 Michael Hanselmann
      "hello": ["Hello World"],
515 8235fe04 Michael Hanselmann
      "other": 2,
516 8235fe04 Michael Hanselmann
      })
517 8235fe04 Michael Hanselmann
    self.assertEqual(query._GetLiveNodeField("hello", constants.QFT_NUMBER,
518 a6070ef7 Michael Hanselmann
                                             ctx, nodes[0]),
519 e2d188cc Iustin Pop
                     query._FS_UNAVAIL)
520 8235fe04 Michael Hanselmann
521 a6070ef7 Michael Hanselmann
    # Offline node
522 a6070ef7 Michael Hanselmann
    assert nodes[3].offline
523 a6070ef7 Michael Hanselmann
    ctx = _QueryData(None, curlive_data={})
524 a6070ef7 Michael Hanselmann
    self.assertEqual(query._GetLiveNodeField("hello", constants.QFT_NUMBER,
525 a6070ef7 Michael Hanselmann
                                             ctx, nodes[3]),
526 e2d188cc Iustin Pop
                     query._FS_OFFLINE, None)
527 a6070ef7 Michael Hanselmann
528 8235fe04 Michael Hanselmann
    # Wrong field type
529 8235fe04 Michael Hanselmann
    ctx = _QueryData(None, curlive_data={"hello": 123})
530 8235fe04 Michael Hanselmann
    self.assertRaises(AssertionError, query._GetLiveNodeField,
531 a6070ef7 Michael Hanselmann
                      "hello", constants.QFT_BOOL, ctx, nodes[0])
532 8235fe04 Michael Hanselmann
533 effab4ca Iustin Pop
    # Non-vm_capable node
534 effab4ca Iustin Pop
    assert not nodes[4].vm_capable
535 effab4ca Iustin Pop
    ctx = _QueryData(None, curlive_data={})
536 effab4ca Iustin Pop
    self.assertEqual(query._GetLiveNodeField("hello", constants.QFT_NUMBER,
537 effab4ca Iustin Pop
                                             ctx, nodes[4]),
538 effab4ca Iustin Pop
                     query._FS_UNAVAIL, None)
539 effab4ca Iustin Pop
540 8235fe04 Michael Hanselmann
541 1c8addc6 Michael Hanselmann
class TestInstanceQuery(unittest.TestCase):
542 1c8addc6 Michael Hanselmann
  def _Create(self, selected):
543 1c8addc6 Michael Hanselmann
    return query.Query(query.INSTANCE_FIELDS, selected)
544 1c8addc6 Michael Hanselmann
545 1c8addc6 Michael Hanselmann
  def testSimple(self):
546 1c8addc6 Michael Hanselmann
    q = self._Create(["name", "be/memory", "ip"])
547 1c8addc6 Michael Hanselmann
    self.assertEqual(q.RequestedData(), set([query.IQ_CONFIG]))
548 1c8addc6 Michael Hanselmann
549 1c8addc6 Michael Hanselmann
    cluster = objects.Cluster(cluster_name="testcluster",
550 1c8addc6 Michael Hanselmann
      hvparams=constants.HVC_DEFAULTS,
551 1c8addc6 Michael Hanselmann
      beparams={
552 1c8addc6 Michael Hanselmann
        constants.PP_DEFAULT: constants.BEC_DEFAULTS,
553 1c8addc6 Michael Hanselmann
        },
554 1c8addc6 Michael Hanselmann
      nicparams={
555 1c8addc6 Michael Hanselmann
        constants.PP_DEFAULT: constants.NICC_DEFAULTS,
556 1c8addc6 Michael Hanselmann
        })
557 1c8addc6 Michael Hanselmann
558 1c8addc6 Michael Hanselmann
    instances = [
559 1c8addc6 Michael Hanselmann
      objects.Instance(name="inst1", hvparams={}, beparams={}, nics=[]),
560 1c8addc6 Michael Hanselmann
      objects.Instance(name="inst2", hvparams={}, nics=[],
561 1c8addc6 Michael Hanselmann
        beparams={
562 1c8addc6 Michael Hanselmann
          constants.BE_MEMORY: 512,
563 1c8addc6 Michael Hanselmann
        }),
564 1c8addc6 Michael Hanselmann
      objects.Instance(name="inst3", hvparams={}, beparams={},
565 1c8addc6 Michael Hanselmann
        nics=[objects.NIC(ip="192.0.2.99", nicparams={})]),
566 1c8addc6 Michael Hanselmann
      ]
567 1c8addc6 Michael Hanselmann
568 5d28cb6f Michael Hanselmann
    iqd = query.InstanceQueryData(instances, cluster, None, [], [], {},
569 5d28cb6f Michael Hanselmann
                                  set(), {})
570 1c8addc6 Michael Hanselmann
    self.assertEqual(q.Query(iqd),
571 cfb084ae René Nussbaumer
      [[(constants.RS_NORMAL, "inst1"),
572 cfb084ae René Nussbaumer
        (constants.RS_NORMAL, 128),
573 cfb084ae René Nussbaumer
        (constants.RS_UNAVAIL, None),
574 1c8addc6 Michael Hanselmann
       ],
575 cfb084ae René Nussbaumer
       [(constants.RS_NORMAL, "inst2"),
576 cfb084ae René Nussbaumer
        (constants.RS_NORMAL, 512),
577 cfb084ae René Nussbaumer
        (constants.RS_UNAVAIL, None),
578 1c8addc6 Michael Hanselmann
       ],
579 cfb084ae René Nussbaumer
       [(constants.RS_NORMAL, "inst3"),
580 cfb084ae René Nussbaumer
        (constants.RS_NORMAL, 128),
581 cfb084ae René Nussbaumer
        (constants.RS_NORMAL, "192.0.2.99"),
582 1c8addc6 Michael Hanselmann
       ]])
583 1c8addc6 Michael Hanselmann
    self.assertEqual(q.OldStyleQuery(iqd),
584 1c8addc6 Michael Hanselmann
      [["inst1", 128, None],
585 1c8addc6 Michael Hanselmann
       ["inst2", 512, None],
586 1c8addc6 Michael Hanselmann
       ["inst3", 128, "192.0.2.99"]])
587 1c8addc6 Michael Hanselmann
588 1c8addc6 Michael Hanselmann
  def test(self):
589 1c8addc6 Michael Hanselmann
    selected = query.INSTANCE_FIELDS.keys()
590 1c8addc6 Michael Hanselmann
    fieldidx = dict((field, idx) for idx, field in enumerate(selected))
591 1c8addc6 Michael Hanselmann
592 1c8addc6 Michael Hanselmann
    macs = ["00:11:22:%02x:%02x:%02x" % (i % 255, i % 3, (i * 123) % 255)
593 1c8addc6 Michael Hanselmann
            for i in range(20)]
594 1c8addc6 Michael Hanselmann
595 1c8addc6 Michael Hanselmann
    q = self._Create(selected)
596 1c8addc6 Michael Hanselmann
    self.assertEqual(q.RequestedData(),
597 5d28cb6f Michael Hanselmann
                     set([query.IQ_CONFIG, query.IQ_LIVE, query.IQ_DISKUSAGE,
598 5d28cb6f Michael Hanselmann
                          query.IQ_CONSOLE]))
599 1c8addc6 Michael Hanselmann
600 1c8addc6 Michael Hanselmann
    cluster = objects.Cluster(cluster_name="testcluster",
601 1c8addc6 Michael Hanselmann
      hvparams=constants.HVC_DEFAULTS,
602 1c8addc6 Michael Hanselmann
      beparams={
603 1c8addc6 Michael Hanselmann
        constants.PP_DEFAULT: constants.BEC_DEFAULTS,
604 1c8addc6 Michael Hanselmann
        },
605 1c8addc6 Michael Hanselmann
      nicparams={
606 1c8addc6 Michael Hanselmann
        constants.PP_DEFAULT: constants.NICC_DEFAULTS,
607 1c8addc6 Michael Hanselmann
        },
608 1c8addc6 Michael Hanselmann
      os_hvp={},
609 1c8addc6 Michael Hanselmann
      tcpudp_port_pool=set())
610 1c8addc6 Michael Hanselmann
611 1c8addc6 Michael Hanselmann
    offline_nodes = ["nodeoff1", "nodeoff2"]
612 1c8addc6 Michael Hanselmann
    bad_nodes = ["nodebad1", "nodebad2", "nodebad3"] + offline_nodes
613 1c8addc6 Michael Hanselmann
    nodes = ["node%s" % i for i in range(10)] + bad_nodes
614 1c8addc6 Michael Hanselmann
615 1c8addc6 Michael Hanselmann
    instances = [
616 1c8addc6 Michael Hanselmann
      objects.Instance(name="inst1", hvparams={}, beparams={}, nics=[],
617 1c8addc6 Michael Hanselmann
        uuid="f90eccb3-e227-4e3c-bf2a-94a21ca8f9cd",
618 1c8addc6 Michael Hanselmann
        ctime=1291244000, mtime=1291244400, serial_no=30,
619 1c8addc6 Michael Hanselmann
        admin_up=True, hypervisor=constants.HT_XEN_PVM, os="linux1",
620 1c8addc6 Michael Hanselmann
        primary_node="node1",
621 1c8addc6 Michael Hanselmann
        disk_template=constants.DT_PLAIN,
622 1c8addc6 Michael Hanselmann
        disks=[]),
623 1c8addc6 Michael Hanselmann
      objects.Instance(name="inst2", hvparams={}, nics=[],
624 1c8addc6 Michael Hanselmann
        uuid="73a0f8a7-068c-4630-ada2-c3440015ab1a",
625 1c8addc6 Michael Hanselmann
        ctime=1291211000, mtime=1291211077, serial_no=1,
626 1c8addc6 Michael Hanselmann
        admin_up=True, hypervisor=constants.HT_XEN_HVM, os="deb99",
627 1c8addc6 Michael Hanselmann
        primary_node="node5",
628 1c8addc6 Michael Hanselmann
        disk_template=constants.DT_DISKLESS,
629 1c8addc6 Michael Hanselmann
        disks=[],
630 1c8addc6 Michael Hanselmann
        beparams={
631 1c8addc6 Michael Hanselmann
          constants.BE_MEMORY: 512,
632 1c8addc6 Michael Hanselmann
        }),
633 1c8addc6 Michael Hanselmann
      objects.Instance(name="inst3", hvparams={}, beparams={},
634 1c8addc6 Michael Hanselmann
        uuid="11ec8dff-fb61-4850-bfe0-baa1803ff280",
635 1c8addc6 Michael Hanselmann
        ctime=1291011000, mtime=1291013000, serial_no=1923,
636 1c8addc6 Michael Hanselmann
        admin_up=False, hypervisor=constants.HT_KVM, os="busybox",
637 1c8addc6 Michael Hanselmann
        primary_node="node6",
638 1c8addc6 Michael Hanselmann
        disk_template=constants.DT_DRBD8,
639 1c8addc6 Michael Hanselmann
        disks=[],
640 1c8addc6 Michael Hanselmann
        nics=[
641 1c8addc6 Michael Hanselmann
          objects.NIC(ip="192.0.2.99", mac=macs.pop(),
642 1c8addc6 Michael Hanselmann
                      nicparams={
643 1c8addc6 Michael Hanselmann
                        constants.NIC_LINK: constants.DEFAULT_BRIDGE,
644 1c8addc6 Michael Hanselmann
                        }),
645 1c8addc6 Michael Hanselmann
          objects.NIC(ip=None, mac=macs.pop(), nicparams={}),
646 1c8addc6 Michael Hanselmann
          ]),
647 1c8addc6 Michael Hanselmann
      objects.Instance(name="inst4", hvparams={}, beparams={},
648 1c8addc6 Michael Hanselmann
        uuid="68dab168-3ef5-4c9d-b4d3-801e0672068c",
649 1c8addc6 Michael Hanselmann
        ctime=1291244390, mtime=1291244395, serial_no=25,
650 1c8addc6 Michael Hanselmann
        admin_up=False, hypervisor=constants.HT_XEN_PVM, os="linux1",
651 1c8addc6 Michael Hanselmann
        primary_node="nodeoff2",
652 1c8addc6 Michael Hanselmann
        disk_template=constants.DT_DRBD8,
653 1c8addc6 Michael Hanselmann
        disks=[],
654 1c8addc6 Michael Hanselmann
        nics=[
655 1c8addc6 Michael Hanselmann
          objects.NIC(ip="192.0.2.1", mac=macs.pop(),
656 1c8addc6 Michael Hanselmann
                      nicparams={
657 1c8addc6 Michael Hanselmann
                        constants.NIC_LINK: constants.DEFAULT_BRIDGE,
658 1c8addc6 Michael Hanselmann
                        }),
659 1c8addc6 Michael Hanselmann
          objects.NIC(ip="192.0.2.2", mac=macs.pop(), nicparams={}),
660 1c8addc6 Michael Hanselmann
          objects.NIC(ip="192.0.2.3", mac=macs.pop(),
661 1c8addc6 Michael Hanselmann
                      nicparams={
662 1c8addc6 Michael Hanselmann
                        constants.NIC_MODE: constants.NIC_MODE_ROUTED,
663 1c8addc6 Michael Hanselmann
                        }),
664 1c8addc6 Michael Hanselmann
          objects.NIC(ip="192.0.2.4", mac=macs.pop(),
665 1c8addc6 Michael Hanselmann
                      nicparams={
666 1c8addc6 Michael Hanselmann
                        constants.NIC_MODE: constants.NIC_MODE_BRIDGED,
667 1c8addc6 Michael Hanselmann
                        constants.NIC_LINK: "eth123",
668 1c8addc6 Michael Hanselmann
                        }),
669 1c8addc6 Michael Hanselmann
          ]),
670 1c8addc6 Michael Hanselmann
      objects.Instance(name="inst5", hvparams={}, nics=[],
671 1c8addc6 Michael Hanselmann
        uuid="0e3dca12-5b42-4e24-98a2-415267545bd0",
672 1c8addc6 Michael Hanselmann
        ctime=1231211000, mtime=1261200000, serial_no=3,
673 1c8addc6 Michael Hanselmann
        admin_up=True, hypervisor=constants.HT_XEN_HVM, os="deb99",
674 1c8addc6 Michael Hanselmann
        primary_node="nodebad2",
675 1c8addc6 Michael Hanselmann
        disk_template=constants.DT_DISKLESS,
676 1c8addc6 Michael Hanselmann
        disks=[],
677 1c8addc6 Michael Hanselmann
        beparams={
678 1c8addc6 Michael Hanselmann
          constants.BE_MEMORY: 512,
679 1c8addc6 Michael Hanselmann
        }),
680 1c8addc6 Michael Hanselmann
      objects.Instance(name="inst6", hvparams={}, nics=[],
681 1c8addc6 Michael Hanselmann
        uuid="72de6580-c8d5-4661-b902-38b5785bb8b3",
682 1c8addc6 Michael Hanselmann
        ctime=7513, mtime=11501, serial_no=13390,
683 1c8addc6 Michael Hanselmann
        admin_up=False, hypervisor=constants.HT_XEN_HVM, os="deb99",
684 1c8addc6 Michael Hanselmann
        primary_node="node7",
685 1c8addc6 Michael Hanselmann
        disk_template=constants.DT_DISKLESS,
686 1c8addc6 Michael Hanselmann
        disks=[],
687 1c8addc6 Michael Hanselmann
        beparams={
688 1c8addc6 Michael Hanselmann
          constants.BE_MEMORY: 768,
689 1c8addc6 Michael Hanselmann
        }),
690 145bea54 Michael Hanselmann
      objects.Instance(name="inst7", hvparams={}, nics=[],
691 145bea54 Michael Hanselmann
        uuid="ceec5dc4-b729-4f42-ae28-69b3cd24920e",
692 145bea54 Michael Hanselmann
        ctime=None, mtime=None, serial_no=1947,
693 145bea54 Michael Hanselmann
        admin_up=False, hypervisor=constants.HT_XEN_HVM, os="deb99",
694 145bea54 Michael Hanselmann
        primary_node="node6",
695 145bea54 Michael Hanselmann
        disk_template=constants.DT_DISKLESS,
696 145bea54 Michael Hanselmann
        disks=[],
697 145bea54 Michael Hanselmann
        beparams={}),
698 1c8addc6 Michael Hanselmann
      ]
699 1c8addc6 Michael Hanselmann
700 145bea54 Michael Hanselmann
    assert not utils.FindDuplicates(inst.name for inst in instances)
701 145bea54 Michael Hanselmann
702 5d28cb6f Michael Hanselmann
    instbyname = dict((inst.name, inst) for inst in instances)
703 5d28cb6f Michael Hanselmann
704 1c8addc6 Michael Hanselmann
    disk_usage = dict((inst.name,
705 1c8addc6 Michael Hanselmann
                       cmdlib._ComputeDiskSize(inst.disk_template,
706 1c8addc6 Michael Hanselmann
                                               [{"size": disk.size}
707 1c8addc6 Michael Hanselmann
                                                for disk in inst.disks]))
708 1c8addc6 Michael Hanselmann
                      for inst in instances)
709 1c8addc6 Michael Hanselmann
710 1c8addc6 Michael Hanselmann
    inst_bridges = {
711 1c8addc6 Michael Hanselmann
      "inst3": [constants.DEFAULT_BRIDGE, constants.DEFAULT_BRIDGE],
712 1c8addc6 Michael Hanselmann
      "inst4": [constants.DEFAULT_BRIDGE, constants.DEFAULT_BRIDGE,
713 1c8addc6 Michael Hanselmann
                None, "eth123"],
714 1c8addc6 Michael Hanselmann
      }
715 1c8addc6 Michael Hanselmann
716 1c8addc6 Michael Hanselmann
    live_data = {
717 1c8addc6 Michael Hanselmann
      "inst2": {
718 1c8addc6 Michael Hanselmann
        "vcpus": 3,
719 1c8addc6 Michael Hanselmann
        },
720 1c8addc6 Michael Hanselmann
      "inst4": {
721 1c8addc6 Michael Hanselmann
        "memory": 123,
722 1c8addc6 Michael Hanselmann
        },
723 1c8addc6 Michael Hanselmann
      "inst6": {
724 1c8addc6 Michael Hanselmann
        "memory": 768,
725 1c8addc6 Michael Hanselmann
        },
726 bacae536 René Nussbaumer
      "inst7": {
727 bacae536 René Nussbaumer
        "vcpus": 3,
728 bacae536 René Nussbaumer
        },
729 1c8addc6 Michael Hanselmann
      }
730 bacae536 René Nussbaumer
    wrongnode_inst = set(["inst7"])
731 1c8addc6 Michael Hanselmann
732 5d28cb6f Michael Hanselmann
    consinfo = dict((inst.name, None) for inst in instances)
733 5d28cb6f Michael Hanselmann
    consinfo["inst7"] = \
734 5d28cb6f Michael Hanselmann
      objects.InstanceConsole(instance="inst7", kind=constants.CONS_SSH,
735 5d28cb6f Michael Hanselmann
                              host=instbyname["inst7"].primary_node,
736 5d28cb6f Michael Hanselmann
                              user=constants.GANETI_RUNAS,
737 5d28cb6f Michael Hanselmann
                              command=["hostname"]).ToDict()
738 5d28cb6f Michael Hanselmann
739 1c8addc6 Michael Hanselmann
    iqd = query.InstanceQueryData(instances, cluster, disk_usage,
740 e431074f René Nussbaumer
                                  offline_nodes, bad_nodes, live_data,
741 5d28cb6f Michael Hanselmann
                                  wrongnode_inst, consinfo)
742 1c8addc6 Michael Hanselmann
    result = q.Query(iqd)
743 1c8addc6 Michael Hanselmann
    self.assertEqual(len(result), len(instances))
744 1c8addc6 Michael Hanselmann
    self.assert_(compat.all(len(row) == len(selected)
745 1c8addc6 Michael Hanselmann
                            for row in result))
746 1c8addc6 Michael Hanselmann
747 1c8addc6 Michael Hanselmann
    assert len(set(bad_nodes) & set(offline_nodes)) == len(offline_nodes), \
748 1c8addc6 Michael Hanselmann
           "Offline nodes not included in bad nodes"
749 1c8addc6 Michael Hanselmann
750 1c8addc6 Michael Hanselmann
    tested_status = set()
751 1c8addc6 Michael Hanselmann
752 1c8addc6 Michael Hanselmann
    for (inst, row) in zip(instances, result):
753 1c8addc6 Michael Hanselmann
      assert inst.primary_node in nodes
754 1c8addc6 Michael Hanselmann
755 1c8addc6 Michael Hanselmann
      self.assertEqual(row[fieldidx["name"]],
756 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, inst.name))
757 1c8addc6 Michael Hanselmann
758 1c8addc6 Michael Hanselmann
      if inst.primary_node in offline_nodes:
759 61a980a9 Michael Hanselmann
        exp_status = constants.INSTST_NODEOFFLINE
760 1c8addc6 Michael Hanselmann
      elif inst.primary_node in bad_nodes:
761 61a980a9 Michael Hanselmann
        exp_status = constants.INSTST_NODEDOWN
762 1c8addc6 Michael Hanselmann
      elif inst.name in live_data:
763 e431074f René Nussbaumer
        if inst.name in wrongnode_inst:
764 61a980a9 Michael Hanselmann
          exp_status = constants.INSTST_WRONGNODE
765 e431074f René Nussbaumer
        elif inst.admin_up:
766 61a980a9 Michael Hanselmann
          exp_status = constants.INSTST_RUNNING
767 1c8addc6 Michael Hanselmann
        else:
768 61a980a9 Michael Hanselmann
          exp_status = constants.INSTST_ERRORUP
769 1c8addc6 Michael Hanselmann
      elif inst.admin_up:
770 61a980a9 Michael Hanselmann
        exp_status = constants.INSTST_ERRORDOWN
771 1c8addc6 Michael Hanselmann
      else:
772 61a980a9 Michael Hanselmann
        exp_status = constants.INSTST_ADMINDOWN
773 1c8addc6 Michael Hanselmann
774 1c8addc6 Michael Hanselmann
      self.assertEqual(row[fieldidx["status"]],
775 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, exp_status))
776 1c8addc6 Michael Hanselmann
777 1c8addc6 Michael Hanselmann
      (_, status) = row[fieldidx["status"]]
778 1c8addc6 Michael Hanselmann
      tested_status.add(status)
779 1c8addc6 Michael Hanselmann
780 1c8addc6 Michael Hanselmann
      for (field, livefield) in [("oper_ram", "memory"),
781 1c8addc6 Michael Hanselmann
                                 ("oper_vcpus", "vcpus")]:
782 1c8addc6 Michael Hanselmann
        if inst.primary_node in bad_nodes:
783 cfb084ae René Nussbaumer
          exp = (constants.RS_NODATA, None)
784 1c8addc6 Michael Hanselmann
        elif inst.name in live_data:
785 1c8addc6 Michael Hanselmann
          value = live_data[inst.name].get(livefield, None)
786 1c8addc6 Michael Hanselmann
          if value is None:
787 cfb084ae René Nussbaumer
            exp = (constants.RS_UNAVAIL, None)
788 1c8addc6 Michael Hanselmann
          else:
789 cfb084ae René Nussbaumer
            exp = (constants.RS_NORMAL, value)
790 1c8addc6 Michael Hanselmann
        else:
791 cfb084ae René Nussbaumer
          exp = (constants.RS_UNAVAIL, None)
792 1c8addc6 Michael Hanselmann
793 1c8addc6 Michael Hanselmann
        self.assertEqual(row[fieldidx[field]], exp)
794 1c8addc6 Michael Hanselmann
795 1c8addc6 Michael Hanselmann
      bridges = inst_bridges.get(inst.name, [])
796 1c8addc6 Michael Hanselmann
      self.assertEqual(row[fieldidx["nic.bridges"]],
797 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, bridges))
798 1c8addc6 Michael Hanselmann
      if bridges:
799 1c8addc6 Michael Hanselmann
        self.assertEqual(row[fieldidx["bridge"]],
800 cfb084ae René Nussbaumer
                         (constants.RS_NORMAL, bridges[0]))
801 1c8addc6 Michael Hanselmann
      else:
802 1c8addc6 Michael Hanselmann
        self.assertEqual(row[fieldidx["bridge"]],
803 cfb084ae René Nussbaumer
                         (constants.RS_UNAVAIL, None))
804 1c8addc6 Michael Hanselmann
805 1c8addc6 Michael Hanselmann
      for i in range(constants.MAX_NICS):
806 1c8addc6 Michael Hanselmann
        if i < len(bridges) and bridges[i] is not None:
807 cfb084ae René Nussbaumer
          exp = (constants.RS_NORMAL, bridges[i])
808 1c8addc6 Michael Hanselmann
        else:
809 cfb084ae René Nussbaumer
          exp = (constants.RS_UNAVAIL, None)
810 1c8addc6 Michael Hanselmann
        self.assertEqual(row[fieldidx["nic.bridge/%s" % i]], exp)
811 1c8addc6 Michael Hanselmann
812 1c8addc6 Michael Hanselmann
      if inst.primary_node in bad_nodes:
813 cfb084ae René Nussbaumer
        exp = (constants.RS_NODATA, None)
814 1c8addc6 Michael Hanselmann
      else:
815 cfb084ae René Nussbaumer
        exp = (constants.RS_NORMAL, inst.name in live_data)
816 1c8addc6 Michael Hanselmann
      self.assertEqual(row[fieldidx["oper_state"]], exp)
817 1c8addc6 Michael Hanselmann
818 1c8addc6 Michael Hanselmann
      usage = disk_usage[inst.name]
819 1c8addc6 Michael Hanselmann
      if usage is None:
820 1c8addc6 Michael Hanselmann
        usage = 0
821 1c8addc6 Michael Hanselmann
      self.assertEqual(row[fieldidx["disk_usage"]],
822 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, usage))
823 1c8addc6 Michael Hanselmann
824 4cc4d1fa Michael Hanselmann
      for alias, target in [("sda_size", "disk.size/0"),
825 4cc4d1fa Michael Hanselmann
                            ("sdb_size", "disk.size/1"),
826 4cc4d1fa Michael Hanselmann
                            ("vcpus", "be/vcpus"),
827 4cc4d1fa Michael Hanselmann
                            ("ip", "nic.ip/0"),
828 4cc4d1fa Michael Hanselmann
                            ("mac", "nic.mac/0"),
829 4cc4d1fa Michael Hanselmann
                            ("bridge", "nic.bridge/0"),
830 4cc4d1fa Michael Hanselmann
                            ("nic_mode", "nic.mode/0"),
831 4cc4d1fa Michael Hanselmann
                            ("nic_link", "nic.link/0"),
832 4cc4d1fa Michael Hanselmann
                            ]:
833 4cc4d1fa Michael Hanselmann
        self.assertEqual(row[fieldidx[alias]], row[fieldidx[target]])
834 1c8addc6 Michael Hanselmann
835 145bea54 Michael Hanselmann
      for field in ["ctime", "mtime"]:
836 145bea54 Michael Hanselmann
        if getattr(inst, field) is None:
837 145bea54 Michael Hanselmann
          # No ctime/mtime
838 cfb084ae René Nussbaumer
          exp = (constants.RS_UNAVAIL, None)
839 145bea54 Michael Hanselmann
        else:
840 cfb084ae René Nussbaumer
          exp = (constants.RS_NORMAL, getattr(inst, field))
841 145bea54 Michael Hanselmann
        self.assertEqual(row[fieldidx[field]], exp)
842 145bea54 Michael Hanselmann
843 5d28cb6f Michael Hanselmann
      self._CheckInstanceConsole(inst, row[fieldidx["console"]])
844 5d28cb6f Michael Hanselmann
845 1c8addc6 Michael Hanselmann
    # Ensure all possible status' have been tested
846 61a980a9 Michael Hanselmann
    self.assertEqual(tested_status, constants.INSTST_ALL)
847 1c8addc6 Michael Hanselmann
848 5d28cb6f Michael Hanselmann
  def _CheckInstanceConsole(self, instance, (status, consdata)):
849 5d28cb6f Michael Hanselmann
    if instance.name == "inst7":
850 5d28cb6f Michael Hanselmann
      self.assertEqual(status, constants.RS_NORMAL)
851 5d28cb6f Michael Hanselmann
      console = objects.InstanceConsole.FromDict(consdata)
852 5d28cb6f Michael Hanselmann
      self.assertTrue(console.Validate())
853 5d28cb6f Michael Hanselmann
      self.assertEqual(console.host, instance.primary_node)
854 5d28cb6f Michael Hanselmann
    else:
855 5d28cb6f Michael Hanselmann
      self.assertEqual(status, constants.RS_UNAVAIL)
856 5d28cb6f Michael Hanselmann
857 1c8addc6 Michael Hanselmann
858 d8b7ff5f Adeodato Simo
class TestGroupQuery(unittest.TestCase):
859 d8b7ff5f Adeodato Simo
860 d8b7ff5f Adeodato Simo
  def setUp(self):
861 d8b7ff5f Adeodato Simo
    self.groups = [
862 d8b7ff5f Adeodato Simo
      objects.NodeGroup(name="default",
863 d8b7ff5f Adeodato Simo
                        uuid="c0e89160-18e7-11e0-a46e-001d0904baeb",
864 d8b7ff5f Adeodato Simo
                        alloc_policy=constants.ALLOC_POLICY_PREFERRED),
865 d8b7ff5f Adeodato Simo
      objects.NodeGroup(name="restricted",
866 d8b7ff5f Adeodato Simo
                        uuid="d2a40a74-18e7-11e0-9143-001d0904baeb",
867 d8b7ff5f Adeodato Simo
                        alloc_policy=constants.ALLOC_POLICY_LAST_RESORT),
868 d8b7ff5f Adeodato Simo
      ]
869 d8b7ff5f Adeodato Simo
870 d8b7ff5f Adeodato Simo
  def _Create(self, selected):
871 d8b7ff5f Adeodato Simo
    return query.Query(query.GROUP_FIELDS, selected)
872 d8b7ff5f Adeodato Simo
873 d8b7ff5f Adeodato Simo
  def testSimple(self):
874 d8b7ff5f Adeodato Simo
    q = self._Create(["name", "uuid", "alloc_policy"])
875 d8b7ff5f Adeodato Simo
    gqd = query.GroupQueryData(self.groups, None, None)
876 d8b7ff5f Adeodato Simo
877 d8b7ff5f Adeodato Simo
    self.assertEqual(q.RequestedData(), set([query.GQ_CONFIG]))
878 d8b7ff5f Adeodato Simo
879 d8b7ff5f Adeodato Simo
    self.assertEqual(q.Query(gqd),
880 cfb084ae René Nussbaumer
      [[(constants.RS_NORMAL, "default"),
881 cfb084ae René Nussbaumer
        (constants.RS_NORMAL, "c0e89160-18e7-11e0-a46e-001d0904baeb"),
882 cfb084ae René Nussbaumer
        (constants.RS_NORMAL, constants.ALLOC_POLICY_PREFERRED)
883 d8b7ff5f Adeodato Simo
        ],
884 cfb084ae René Nussbaumer
       [(constants.RS_NORMAL, "restricted"),
885 cfb084ae René Nussbaumer
        (constants.RS_NORMAL, "d2a40a74-18e7-11e0-9143-001d0904baeb"),
886 cfb084ae René Nussbaumer
        (constants.RS_NORMAL, constants.ALLOC_POLICY_LAST_RESORT)
887 d8b7ff5f Adeodato Simo
        ],
888 d8b7ff5f Adeodato Simo
       ])
889 d8b7ff5f Adeodato Simo
890 d8b7ff5f Adeodato Simo
  def testNodes(self):
891 d8b7ff5f Adeodato Simo
    groups_to_nodes = {
892 d8b7ff5f Adeodato Simo
      "c0e89160-18e7-11e0-a46e-001d0904baeb": ["node1", "node2"],
893 d8b7ff5f Adeodato Simo
      "d2a40a74-18e7-11e0-9143-001d0904baeb": ["node1", "node10", "node9"],
894 d8b7ff5f Adeodato Simo
      }
895 d8b7ff5f Adeodato Simo
896 d8b7ff5f Adeodato Simo
    q = self._Create(["name", "node_cnt", "node_list"])
897 d8b7ff5f Adeodato Simo
    gqd = query.GroupQueryData(self.groups, groups_to_nodes, None)
898 d8b7ff5f Adeodato Simo
899 d8b7ff5f Adeodato Simo
    self.assertEqual(q.RequestedData(), set([query.GQ_CONFIG, query.GQ_NODE]))
900 d8b7ff5f Adeodato Simo
901 d8b7ff5f Adeodato Simo
    self.assertEqual(q.Query(gqd),
902 cfb084ae René Nussbaumer
                     [[(constants.RS_NORMAL, "default"),
903 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 2),
904 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, ["node1", "node2"]),
905 d8b7ff5f Adeodato Simo
                       ],
906 cfb084ae René Nussbaumer
                      [(constants.RS_NORMAL, "restricted"),
907 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, 3),
908 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, ["node1", "node9", "node10"]),
909 d8b7ff5f Adeodato Simo
                       ],
910 d8b7ff5f Adeodato Simo
                      ])
911 d8b7ff5f Adeodato Simo
912 d8b7ff5f Adeodato Simo
  def testInstances(self):
913 d8b7ff5f Adeodato Simo
    groups_to_instances = {
914 d8b7ff5f Adeodato Simo
      "c0e89160-18e7-11e0-a46e-001d0904baeb": ["inst1", "inst2"],
915 d8b7ff5f Adeodato Simo
      "d2a40a74-18e7-11e0-9143-001d0904baeb": ["inst1", "inst10", "inst9"],
916 d8b7ff5f Adeodato Simo
      }
917 d8b7ff5f Adeodato Simo
918 d8b7ff5f Adeodato Simo
    q = self._Create(["pinst_cnt", "pinst_list"])
919 d8b7ff5f Adeodato Simo
    gqd = query.GroupQueryData(self.groups, None, groups_to_instances)
920 d8b7ff5f Adeodato Simo
921 d8b7ff5f Adeodato Simo
    self.assertEqual(q.RequestedData(), set([query.GQ_INST]))
922 d8b7ff5f Adeodato Simo
923 d8b7ff5f Adeodato Simo
    self.assertEqual(q.Query(gqd),
924 cfb084ae René Nussbaumer
                     [[(constants.RS_NORMAL, 2),
925 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, ["inst1", "inst2"]),
926 d8b7ff5f Adeodato Simo
                       ],
927 cfb084ae René Nussbaumer
                      [(constants.RS_NORMAL, 3),
928 cfb084ae René Nussbaumer
                       (constants.RS_NORMAL, ["inst1", "inst9", "inst10"]),
929 d8b7ff5f Adeodato Simo
                       ],
930 d8b7ff5f Adeodato Simo
                      ])
931 d8b7ff5f Adeodato Simo
932 d8b7ff5f Adeodato Simo
933 aa29e95f Michael Hanselmann
class TestQueryFields(unittest.TestCase):
934 aa29e95f Michael Hanselmann
  def testAllFields(self):
935 e571ee44 Adeodato Simo
    for fielddefs in query.ALL_FIELD_LISTS:
936 aa29e95f Michael Hanselmann
      result = query.QueryFields(fielddefs, None)
937 aa29e95f Michael Hanselmann
      self.assert_(isinstance(result, dict))
938 aa29e95f Michael Hanselmann
      response = objects.QueryFieldsResponse.FromDict(result)
939 aa29e95f Michael Hanselmann
      self.assertEqual([(fdef.name, fdef.title) for fdef in response.fields],
940 aa29e95f Michael Hanselmann
        [(fdef2.name, fdef2.title)
941 aa29e95f Michael Hanselmann
         for (fdef2, _, _) in utils.NiceSort(fielddefs.values(),
942 aa29e95f Michael Hanselmann
                                             key=lambda x: x[0].name)])
943 aa29e95f Michael Hanselmann
944 aa29e95f Michael Hanselmann
  def testSomeFields(self):
945 aa29e95f Michael Hanselmann
    rnd = random.Random(5357)
946 aa29e95f Michael Hanselmann
947 aa29e95f Michael Hanselmann
    for _ in range(10):
948 e571ee44 Adeodato Simo
      for fielddefs in query.ALL_FIELD_LISTS:
949 e571ee44 Adeodato Simo
        if len(fielddefs) > 20:
950 e571ee44 Adeodato Simo
          sample_size = rnd.randint(5, 20)
951 e571ee44 Adeodato Simo
        else:
952 e571ee44 Adeodato Simo
          sample_size = rnd.randint(1, max(1, len(fielddefs) - 1))
953 e571ee44 Adeodato Simo
        fields = [fdef for (fdef, _, _) in rnd.sample(fielddefs.values(),
954 e571ee44 Adeodato Simo
                                                      sample_size)]
955 aa29e95f Michael Hanselmann
        result = query.QueryFields(fielddefs, [fdef.name for fdef in fields])
956 aa29e95f Michael Hanselmann
        self.assert_(isinstance(result, dict))
957 aa29e95f Michael Hanselmann
        response = objects.QueryFieldsResponse.FromDict(result)
958 aa29e95f Michael Hanselmann
        self.assertEqual([(fdef.name, fdef.title) for fdef in response.fields],
959 aa29e95f Michael Hanselmann
                         [(fdef2.name, fdef2.title) for fdef2 in fields])
960 aa29e95f Michael Hanselmann
961 aa29e95f Michael Hanselmann
962 4ca96421 Michael Hanselmann
if __name__ == "__main__":
963 4ca96421 Michael Hanselmann
  testutils.GanetiTestProgram()