Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rapi.client_unittest.py @ bfc2002f

History | View | Annotate | Download (16.4 kB)

1 95ab4de9 David Knowles
#!/usr/bin/python
2 95ab4de9 David Knowles
#
3 95ab4de9 David Knowles
4 95ab4de9 David Knowles
# Copyright (C) 2010 Google Inc.
5 95ab4de9 David Knowles
#
6 95ab4de9 David Knowles
# This program is free software; you can redistribute it and/or modify
7 95ab4de9 David Knowles
# it under the terms of the GNU General Public License as published by
8 95ab4de9 David Knowles
# the Free Software Foundation; either version 2 of the License, or
9 95ab4de9 David Knowles
# (at your option) any later version.
10 95ab4de9 David Knowles
#
11 95ab4de9 David Knowles
# This program is distributed in the hope that it will be useful, but
12 95ab4de9 David Knowles
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 95ab4de9 David Knowles
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 95ab4de9 David Knowles
# General Public License for more details.
15 95ab4de9 David Knowles
#
16 95ab4de9 David Knowles
# You should have received a copy of the GNU General Public License
17 95ab4de9 David Knowles
# along with this program; if not, write to the Free Software
18 95ab4de9 David Knowles
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 95ab4de9 David Knowles
# 02110-1301, USA.
20 95ab4de9 David Knowles
21 95ab4de9 David Knowles
22 95ab4de9 David Knowles
"""Script for unittesting the RAPI client module"""
23 95ab4de9 David Knowles
24 95ab4de9 David Knowles
25 95ab4de9 David Knowles
import re
26 95ab4de9 David Knowles
import unittest
27 95ab4de9 David Knowles
import warnings
28 95ab4de9 David Knowles
29 95ab4de9 David Knowles
from ganeti import http
30 d9b67f70 Michael Hanselmann
from ganeti import serializer
31 95ab4de9 David Knowles
32 95ab4de9 David Knowles
from ganeti.rapi import connector
33 95ab4de9 David Knowles
from ganeti.rapi import rlib2
34 9279e986 Michael Hanselmann
from ganeti.rapi import client
35 95ab4de9 David Knowles
36 95ab4de9 David Knowles
import testutils
37 95ab4de9 David Knowles
38 95ab4de9 David Knowles
39 95ab4de9 David Knowles
_URI_RE = re.compile(r"https://(?P<host>.*):(?P<port>\d+)(?P<path>/.*)")
40 95ab4de9 David Knowles
41 95ab4de9 David Knowles
42 95ab4de9 David Knowles
def _GetPathFromUri(uri):
43 95ab4de9 David Knowles
  """Gets the path and query from a URI.
44 95ab4de9 David Knowles

45 95ab4de9 David Knowles
  """
46 95ab4de9 David Knowles
  match = _URI_RE.match(uri)
47 95ab4de9 David Knowles
  if match:
48 95ab4de9 David Knowles
    return match.groupdict()["path"]
49 95ab4de9 David Knowles
  else:
50 95ab4de9 David Knowles
    return None
51 95ab4de9 David Knowles
52 95ab4de9 David Knowles
53 9279e986 Michael Hanselmann
class HttpResponseMock:
54 9279e986 Michael Hanselmann
  """Dumb mock of httplib.HTTPResponse.
55 95ab4de9 David Knowles

56 95ab4de9 David Knowles
  """
57 95ab4de9 David Knowles
58 9279e986 Michael Hanselmann
  def __init__(self, code, data):
59 9279e986 Michael Hanselmann
    self.code = code
60 9279e986 Michael Hanselmann
    self._data = data
61 9279e986 Michael Hanselmann
62 9279e986 Michael Hanselmann
  def read(self):
63 9279e986 Michael Hanselmann
    return self._data
64 95ab4de9 David Knowles
65 95ab4de9 David Knowles
66 9279e986 Michael Hanselmann
class OpenerDirectorMock:
67 9279e986 Michael Hanselmann
  """Mock for urllib.OpenerDirector.
68 95ab4de9 David Knowles

69 95ab4de9 David Knowles
  """
70 95ab4de9 David Knowles
71 95ab4de9 David Knowles
  def __init__(self, rapi):
72 95ab4de9 David Knowles
    self._rapi = rapi
73 9279e986 Michael Hanselmann
    self.last_request = None
74 95ab4de9 David Knowles
75 9279e986 Michael Hanselmann
  def open(self, req):
76 9279e986 Michael Hanselmann
    self.last_request = req
77 95ab4de9 David Knowles
78 9279e986 Michael Hanselmann
    path = _GetPathFromUri(req.get_full_url())
79 9279e986 Michael Hanselmann
    code, resp_body = self._rapi.FetchResponse(path, req.get_method())
80 9279e986 Michael Hanselmann
    return HttpResponseMock(code, resp_body)
81 95ab4de9 David Knowles
82 95ab4de9 David Knowles
83 95ab4de9 David Knowles
class RapiMock(object):
84 95ab4de9 David Knowles
  def __init__(self):
85 95ab4de9 David Knowles
    self._mapper = connector.Mapper()
86 95ab4de9 David Knowles
    self._responses = []
87 95ab4de9 David Knowles
    self._last_handler = None
88 95ab4de9 David Knowles
89 de4f53e6 Michael Hanselmann
  def AddResponse(self, response, code=200):
90 de4f53e6 Michael Hanselmann
    self._responses.insert(0, (code, response))
91 95ab4de9 David Knowles
92 95ab4de9 David Knowles
  def GetLastHandler(self):
93 95ab4de9 David Knowles
    return self._last_handler
94 95ab4de9 David Knowles
95 95ab4de9 David Knowles
  def FetchResponse(self, path, method):
96 95ab4de9 David Knowles
    try:
97 95ab4de9 David Knowles
      HandlerClass, items, args = self._mapper.getController(path)
98 95ab4de9 David Knowles
      self._last_handler = HandlerClass(items, args, None)
99 95ab4de9 David Knowles
      if not hasattr(self._last_handler, method.upper()):
100 de4f53e6 Michael Hanselmann
        raise http.HttpNotImplemented(message="Method not implemented")
101 de4f53e6 Michael Hanselmann
102 95ab4de9 David Knowles
    except http.HttpException, ex:
103 95ab4de9 David Knowles
      code = ex.code
104 95ab4de9 David Knowles
      response = ex.message
105 de4f53e6 Michael Hanselmann
    else:
106 de4f53e6 Michael Hanselmann
      if not self._responses:
107 de4f53e6 Michael Hanselmann
        raise Exception("No responses")
108 95ab4de9 David Knowles
109 de4f53e6 Michael Hanselmann
      (code, response) = self._responses.pop()
110 95ab4de9 David Knowles
111 95ab4de9 David Knowles
    return code, response
112 95ab4de9 David Knowles
113 95ab4de9 David Knowles
114 95ab4de9 David Knowles
class RapiMockTest(unittest.TestCase):
115 95ab4de9 David Knowles
  def test(self):
116 95ab4de9 David Knowles
    rapi = RapiMock()
117 95ab4de9 David Knowles
    path = "/version"
118 95ab4de9 David Knowles
    self.assertEqual((404, None), rapi.FetchResponse("/foo", "GET"))
119 09127904 Michael Hanselmann
    self.assertEqual((501, "Method not implemented"),
120 95ab4de9 David Knowles
                     rapi.FetchResponse("/version", "POST"))
121 95ab4de9 David Knowles
    rapi.AddResponse("2")
122 95ab4de9 David Knowles
    code, response = rapi.FetchResponse("/version", "GET")
123 95ab4de9 David Knowles
    self.assertEqual(200, code)
124 95ab4de9 David Knowles
    self.assertEqual("2", response)
125 95ab4de9 David Knowles
    self.failUnless(isinstance(rapi.GetLastHandler(), rlib2.R_version))
126 95ab4de9 David Knowles
127 95ab4de9 David Knowles
128 d9b67f70 Michael Hanselmann
class GanetiRapiClientTests(testutils.GanetiTestCase):
129 95ab4de9 David Knowles
  def setUp(self):
130 d9b67f70 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
131 d9b67f70 Michael Hanselmann
132 95ab4de9 David Knowles
    self.rapi = RapiMock()
133 9279e986 Michael Hanselmann
    self.http = OpenerDirectorMock(self.rapi)
134 95ab4de9 David Knowles
    self.client = client.GanetiRapiClient('master.foo.com')
135 95ab4de9 David Knowles
    self.client._http = self.http
136 95ab4de9 David Knowles
    # Hard-code the version for easier testing.
137 95ab4de9 David Knowles
    self.client._version = 2
138 95ab4de9 David Knowles
139 95ab4de9 David Knowles
  def assertHandler(self, handler_cls):
140 95ab4de9 David Knowles
    self.failUnless(isinstance(self.rapi.GetLastHandler(), handler_cls))
141 95ab4de9 David Knowles
142 95ab4de9 David Knowles
  def assertQuery(self, key, value):
143 95ab4de9 David Knowles
    self.assertEqual(value, self.rapi.GetLastHandler().queryargs.get(key, None))
144 95ab4de9 David Knowles
145 95ab4de9 David Knowles
  def assertItems(self, items):
146 95ab4de9 David Knowles
    self.assertEqual(items, self.rapi.GetLastHandler().items)
147 95ab4de9 David Knowles
148 95ab4de9 David Knowles
  def assertBulk(self):
149 95ab4de9 David Knowles
    self.assertTrue(self.rapi.GetLastHandler().useBulk())
150 95ab4de9 David Knowles
151 95ab4de9 David Knowles
  def assertDryRun(self):
152 95ab4de9 David Knowles
    self.assertTrue(self.rapi.GetLastHandler().dryRun())
153 95ab4de9 David Knowles
154 10f5ab6c Michael Hanselmann
  def testEncodeQuery(self):
155 10f5ab6c Michael Hanselmann
    query = [
156 10f5ab6c Michael Hanselmann
      ("a", None),
157 10f5ab6c Michael Hanselmann
      ("b", 1),
158 10f5ab6c Michael Hanselmann
      ("c", 2),
159 10f5ab6c Michael Hanselmann
      ("d", "Foo"),
160 10f5ab6c Michael Hanselmann
      ("e", True),
161 10f5ab6c Michael Hanselmann
      ]
162 10f5ab6c Michael Hanselmann
163 10f5ab6c Michael Hanselmann
    expected = [
164 10f5ab6c Michael Hanselmann
      ("a", ""),
165 10f5ab6c Michael Hanselmann
      ("b", 1),
166 10f5ab6c Michael Hanselmann
      ("c", 2),
167 10f5ab6c Michael Hanselmann
      ("d", "Foo"),
168 10f5ab6c Michael Hanselmann
      ("e", 1),
169 10f5ab6c Michael Hanselmann
      ]
170 10f5ab6c Michael Hanselmann
171 10f5ab6c Michael Hanselmann
    self.assertEqualValues(self.client._EncodeQuery(query),
172 10f5ab6c Michael Hanselmann
                           expected)
173 10f5ab6c Michael Hanselmann
174 10f5ab6c Michael Hanselmann
    # invalid types
175 10f5ab6c Michael Hanselmann
    for i in [[1, 2, 3], {"moo": "boo"}, (1, 2, 3)]:
176 10f5ab6c Michael Hanselmann
      self.assertRaises(ValueError, self.client._EncodeQuery, [("x", i)])
177 10f5ab6c Michael Hanselmann
178 8a019a03 Michael Hanselmann
  def testHttpError(self):
179 8a019a03 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
180 8a019a03 Michael Hanselmann
    try:
181 8a019a03 Michael Hanselmann
      self.client.GetJobStatus(15140)
182 8a019a03 Michael Hanselmann
    except client.GanetiApiError, err:
183 8a019a03 Michael Hanselmann
      self.assertEqual(err.code, 404)
184 8a019a03 Michael Hanselmann
    else:
185 8a019a03 Michael Hanselmann
      self.fail("Didn't raise exception")
186 8a019a03 Michael Hanselmann
187 95ab4de9 David Knowles
  def testGetVersion(self):
188 95ab4de9 David Knowles
    self.client._version = None
189 95ab4de9 David Knowles
    self.rapi.AddResponse("2")
190 95ab4de9 David Knowles
    self.assertEqual(2, self.client.GetVersion())
191 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_version)
192 95ab4de9 David Knowles
193 95ab4de9 David Knowles
  def testGetOperatingSystems(self):
194 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"beos\"]")
195 95ab4de9 David Knowles
    self.assertEqual(["beos"], self.client.GetOperatingSystems())
196 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_os)
197 95ab4de9 David Knowles
198 95ab4de9 David Knowles
  def testGetClusterTags(self):
199 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"tag\"]")
200 95ab4de9 David Knowles
    self.assertEqual(["tag"], self.client.GetClusterTags())
201 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
202 95ab4de9 David Knowles
203 95ab4de9 David Knowles
  def testAddClusterTags(self):
204 cab667cc David Knowles
    self.rapi.AddResponse("1234")
205 cab667cc David Knowles
    self.assertEqual(1234,
206 cab667cc David Knowles
        self.client.AddClusterTags(["awesome"], dry_run=True))
207 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
208 95ab4de9 David Knowles
    self.assertDryRun()
209 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
210 95ab4de9 David Knowles
211 95ab4de9 David Knowles
  def testDeleteClusterTags(self):
212 cd577680 Michael Hanselmann
    self.rapi.AddResponse("5107")
213 cd577680 Michael Hanselmann
    self.assertEqual(5107, self.client.DeleteClusterTags(["awesome"],
214 cd577680 Michael Hanselmann
                                                         dry_run=True))
215 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
216 95ab4de9 David Knowles
    self.assertDryRun()
217 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
218 95ab4de9 David Knowles
219 95ab4de9 David Knowles
  def testGetInfo(self):
220 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
221 95ab4de9 David Knowles
    self.assertEqual({}, self.client.GetInfo())
222 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_info)
223 95ab4de9 David Knowles
224 95ab4de9 David Knowles
  def testGetInstances(self):
225 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
226 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstances(bulk=True))
227 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
228 95ab4de9 David Knowles
    self.assertBulk()
229 95ab4de9 David Knowles
230 95ab4de9 David Knowles
  def testGetInstanceInfo(self):
231 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
232 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstanceInfo("instance"))
233 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
234 95ab4de9 David Knowles
    self.assertItems(["instance"])
235 95ab4de9 David Knowles
236 95ab4de9 David Knowles
  def testCreateInstance(self):
237 95ab4de9 David Knowles
    self.rapi.AddResponse("1234")
238 95ab4de9 David Knowles
    self.assertEqual(1234, self.client.CreateInstance(dry_run=True))
239 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
240 95ab4de9 David Knowles
    self.assertDryRun()
241 95ab4de9 David Knowles
242 95ab4de9 David Knowles
  def testDeleteInstance(self):
243 cab667cc David Knowles
    self.rapi.AddResponse("1234")
244 cab667cc David Knowles
    self.assertEqual(1234, self.client.DeleteInstance("instance", dry_run=True))
245 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
246 95ab4de9 David Knowles
    self.assertItems(["instance"])
247 95ab4de9 David Knowles
    self.assertDryRun()
248 95ab4de9 David Knowles
249 95ab4de9 David Knowles
  def testGetInstanceTags(self):
250 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
251 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstanceTags("fooinstance"))
252 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
253 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
254 95ab4de9 David Knowles
255 95ab4de9 David Knowles
  def testAddInstanceTags(self):
256 cab667cc David Knowles
    self.rapi.AddResponse("1234")
257 cab667cc David Knowles
    self.assertEqual(1234,
258 cab667cc David Knowles
        self.client.AddInstanceTags("fooinstance", ["awesome"], dry_run=True))
259 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
260 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
261 95ab4de9 David Knowles
    self.assertDryRun()
262 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
263 95ab4de9 David Knowles
264 95ab4de9 David Knowles
  def testDeleteInstanceTags(self):
265 cd577680 Michael Hanselmann
    self.rapi.AddResponse("25826")
266 cd577680 Michael Hanselmann
    self.assertEqual(25826, self.client.DeleteInstanceTags("foo", ["awesome"],
267 cd577680 Michael Hanselmann
                                                           dry_run=True))
268 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
269 95ab4de9 David Knowles
    self.assertItems(["foo"])
270 95ab4de9 David Knowles
    self.assertDryRun()
271 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
272 95ab4de9 David Knowles
273 95ab4de9 David Knowles
  def testRebootInstance(self):
274 cd577680 Michael Hanselmann
    self.rapi.AddResponse("6146")
275 cd577680 Michael Hanselmann
    job_id = self.client.RebootInstance("i-bar", reboot_type="hard",
276 cd577680 Michael Hanselmann
                                        ignore_secondaries=True, dry_run=True)
277 cd577680 Michael Hanselmann
    self.assertEqual(6146, job_id)
278 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reboot)
279 95ab4de9 David Knowles
    self.assertItems(["i-bar"])
280 95ab4de9 David Knowles
    self.assertDryRun()
281 95ab4de9 David Knowles
    self.assertQuery("type", ["hard"])
282 10f5ab6c Michael Hanselmann
    self.assertQuery("ignore_secondaries", ["1"])
283 95ab4de9 David Knowles
284 95ab4de9 David Knowles
  def testShutdownInstance(self):
285 cd577680 Michael Hanselmann
    self.rapi.AddResponse("1487")
286 cd577680 Michael Hanselmann
    self.assertEqual(1487, self.client.ShutdownInstance("foo-instance",
287 cd577680 Michael Hanselmann
                                                        dry_run=True))
288 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_shutdown)
289 95ab4de9 David Knowles
    self.assertItems(["foo-instance"])
290 95ab4de9 David Knowles
    self.assertDryRun()
291 95ab4de9 David Knowles
292 95ab4de9 David Knowles
  def testStartupInstance(self):
293 cd577680 Michael Hanselmann
    self.rapi.AddResponse("27149")
294 cd577680 Michael Hanselmann
    self.assertEqual(27149, self.client.StartupInstance("bar-instance",
295 cd577680 Michael Hanselmann
                                                        dry_run=True))
296 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_startup)
297 95ab4de9 David Knowles
    self.assertItems(["bar-instance"])
298 95ab4de9 David Knowles
    self.assertDryRun()
299 95ab4de9 David Knowles
300 95ab4de9 David Knowles
  def testReinstallInstance(self):
301 cd577680 Michael Hanselmann
    self.rapi.AddResponse("19119")
302 cd577680 Michael Hanselmann
    self.assertEqual(19119, self.client.ReinstallInstance("baz-instance", "DOS",
303 cd577680 Michael Hanselmann
                                                          no_startup=True))
304 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
305 95ab4de9 David Knowles
    self.assertItems(["baz-instance"])
306 95ab4de9 David Knowles
    self.assertQuery("os", ["DOS"])
307 95ab4de9 David Knowles
    self.assertQuery("nostartup", ["1"])
308 95ab4de9 David Knowles
309 95ab4de9 David Knowles
  def testReplaceInstanceDisks(self):
310 95ab4de9 David Knowles
    self.rapi.AddResponse("999")
311 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-name",
312 bfc2002f Michael Hanselmann
        disks=[0, 1], dry_run=True, iallocator="hail")
313 95ab4de9 David Knowles
    self.assertEqual(999, job_id)
314 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_replace_disks)
315 95ab4de9 David Knowles
    self.assertItems(["instance-name"])
316 bfc2002f Michael Hanselmann
    self.assertQuery("disks", ["0,1"])
317 95ab4de9 David Knowles
    self.assertQuery("mode", ["replace_auto"])
318 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
319 95ab4de9 David Knowles
    self.assertDryRun()
320 95ab4de9 David Knowles
321 95ab4de9 David Knowles
    self.rapi.AddResponse("1000")
322 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-bar",
323 bfc2002f Michael Hanselmann
        disks=[1], mode="replace_on_secondary", remote_node="foo-node",
324 95ab4de9 David Knowles
        dry_run=True)
325 95ab4de9 David Knowles
    self.assertEqual(1000, job_id)
326 95ab4de9 David Knowles
    self.assertItems(["instance-bar"])
327 bfc2002f Michael Hanselmann
    self.assertQuery("disks", ["1"])
328 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["foo-node"])
329 95ab4de9 David Knowles
    self.assertDryRun()
330 95ab4de9 David Knowles
331 bfc2002f Michael Hanselmann
    self.rapi.AddResponse("5175")
332 bfc2002f Michael Hanselmann
    self.assertEqual(5175, self.client.ReplaceInstanceDisks("instance-moo"))
333 bfc2002f Michael Hanselmann
    self.assertItems(["instance-moo"])
334 bfc2002f Michael Hanselmann
    self.assertQuery("disks", None)
335 bfc2002f Michael Hanselmann
336 95ab4de9 David Knowles
  def testGetJobs(self):
337 2004e673 Iustin Pop
    self.rapi.AddResponse('[ { "id": "123", "uri": "\\/2\\/jobs\\/123" },'
338 2004e673 Iustin Pop
                          '  { "id": "124", "uri": "\\/2\\/jobs\\/124" } ]')
339 95ab4de9 David Knowles
    self.assertEqual([123, 124], self.client.GetJobs())
340 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs)
341 95ab4de9 David Knowles
342 95ab4de9 David Knowles
  def testGetJobStatus(self):
343 95ab4de9 David Knowles
    self.rapi.AddResponse("{\"foo\": \"bar\"}")
344 95ab4de9 David Knowles
    self.assertEqual({"foo": "bar"}, self.client.GetJobStatus(1234))
345 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
346 95ab4de9 David Knowles
    self.assertItems(["1234"])
347 95ab4de9 David Knowles
348 d9b67f70 Michael Hanselmann
  def testWaitForJobChange(self):
349 d9b67f70 Michael Hanselmann
    fields = ["id", "summary"]
350 d9b67f70 Michael Hanselmann
    expected = {
351 d9b67f70 Michael Hanselmann
      "job_info": [123, "something"],
352 d9b67f70 Michael Hanselmann
      "log_entries": [],
353 d9b67f70 Michael Hanselmann
      }
354 d9b67f70 Michael Hanselmann
355 d9b67f70 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson(expected))
356 d9b67f70 Michael Hanselmann
    result = self.client.WaitForJobChange(123, fields, [], -1)
357 d9b67f70 Michael Hanselmann
    self.assertEqualValues(expected, result)
358 d9b67f70 Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id_wait)
359 d9b67f70 Michael Hanselmann
    self.assertItems(["123"])
360 d9b67f70 Michael Hanselmann
361 cf9ada49 Michael Hanselmann
  def testCancelJob(self):
362 cd577680 Michael Hanselmann
    self.rapi.AddResponse("[true, \"Job 123 will be canceled\"]")
363 cd577680 Michael Hanselmann
    self.assertEqual([True, "Job 123 will be canceled"],
364 cf9ada49 Michael Hanselmann
                     self.client.CancelJob(999, dry_run=True))
365 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
366 95ab4de9 David Knowles
    self.assertItems(["999"])
367 95ab4de9 David Knowles
    self.assertDryRun()
368 95ab4de9 David Knowles
369 95ab4de9 David Knowles
  def testGetNodes(self):
370 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
371 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
372 95ab4de9 David Knowles
    self.assertEqual(["node1", "node2"], self.client.GetNodes())
373 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
374 95ab4de9 David Knowles
375 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
376 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
377 95ab4de9 David Knowles
    self.assertEqual([{"id": "node1", "uri": "uri1"},
378 95ab4de9 David Knowles
                      {"id": "node2", "uri": "uri2"}],
379 95ab4de9 David Knowles
                     self.client.GetNodes(bulk=True))
380 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
381 95ab4de9 David Knowles
    self.assertBulk()
382 95ab4de9 David Knowles
383 95ab4de9 David Knowles
  def testGetNodeInfo(self):
384 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
385 95ab4de9 David Knowles
    self.assertEqual({}, self.client.GetNodeInfo("node-foo"))
386 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name)
387 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
388 95ab4de9 David Knowles
389 95ab4de9 David Knowles
  def testEvacuateNode(self):
390 95ab4de9 David Knowles
    self.rapi.AddResponse("9876")
391 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-1", remote_node="node-2")
392 95ab4de9 David Knowles
    self.assertEqual(9876, job_id)
393 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_evacuate)
394 95ab4de9 David Knowles
    self.assertItems(["node-1"])
395 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["node-2"])
396 95ab4de9 David Knowles
397 95ab4de9 David Knowles
    self.rapi.AddResponse("8888")
398 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-3", iallocator="hail", dry_run=True)
399 95ab4de9 David Knowles
    self.assertEqual(8888, job_id)
400 95ab4de9 David Knowles
    self.assertItems(["node-3"])
401 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
402 95ab4de9 David Knowles
    self.assertDryRun()
403 95ab4de9 David Knowles
404 95ab4de9 David Knowles
    self.assertRaises(client.GanetiApiError,
405 95ab4de9 David Knowles
                      self.client.EvacuateNode,
406 95ab4de9 David Knowles
                      "node-4", iallocator="hail", remote_node="node-5")
407 95ab4de9 David Knowles
408 95ab4de9 David Knowles
  def testMigrateNode(self):
409 95ab4de9 David Knowles
    self.rapi.AddResponse("1111")
410 95ab4de9 David Knowles
    self.assertEqual(1111, self.client.MigrateNode("node-a", dry_run=True))
411 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
412 95ab4de9 David Knowles
    self.assertItems(["node-a"])
413 95ab4de9 David Knowles
    self.assertQuery("live", ["1"])
414 95ab4de9 David Knowles
    self.assertDryRun()
415 95ab4de9 David Knowles
416 95ab4de9 David Knowles
  def testGetNodeRole(self):
417 95ab4de9 David Knowles
    self.rapi.AddResponse("\"master\"")
418 95ab4de9 David Knowles
    self.assertEqual("master", self.client.GetNodeRole("node-a"))
419 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
420 95ab4de9 David Knowles
    self.assertItems(["node-a"])
421 95ab4de9 David Knowles
422 95ab4de9 David Knowles
  def testSetNodeRole(self):
423 95ab4de9 David Knowles
    self.rapi.AddResponse("789")
424 95ab4de9 David Knowles
    self.assertEqual(789,
425 95ab4de9 David Knowles
        self.client.SetNodeRole("node-foo", "master-candidate", force=True))
426 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
427 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
428 10f5ab6c Michael Hanselmann
    self.assertQuery("force", ["1"])
429 9279e986 Michael Hanselmann
    self.assertEqual("\"master-candidate\"", self.http.last_request.data)
430 95ab4de9 David Knowles
431 95ab4de9 David Knowles
    self.assertRaises(client.InvalidNodeRole,
432 95ab4de9 David Knowles
                      self.client.SetNodeRole, "node-bar", "fake-role")
433 95ab4de9 David Knowles
434 95ab4de9 David Knowles
  def testGetNodeStorageUnits(self):
435 95ab4de9 David Knowles
    self.rapi.AddResponse("42")
436 95ab4de9 David Knowles
    self.assertEqual(42,
437 95ab4de9 David Knowles
        self.client.GetNodeStorageUnits("node-x", "lvm-pv", "fields"))
438 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage)
439 95ab4de9 David Knowles
    self.assertItems(["node-x"])
440 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
441 95ab4de9 David Knowles
    self.assertQuery("output_fields", ["fields"])
442 95ab4de9 David Knowles
443 95ab4de9 David Knowles
  def testModifyNodeStorageUnits(self):
444 95ab4de9 David Knowles
    self.rapi.AddResponse("14")
445 95ab4de9 David Knowles
    self.assertEqual(14,
446 95ab4de9 David Knowles
        self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda"))
447 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
448 95ab4de9 David Knowles
    self.assertItems(["node-z"])
449 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
450 95ab4de9 David Knowles
    self.assertQuery("name", ["hda"])
451 fde28316 Michael Hanselmann
    self.assertQuery("allocatable", None)
452 fde28316 Michael Hanselmann
453 fde28316 Michael Hanselmann
    for allocatable, query_allocatable in [(True, "1"), (False, "0")]:
454 fde28316 Michael Hanselmann
      self.rapi.AddResponse("7205")
455 fde28316 Michael Hanselmann
      job_id = self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda",
456 fde28316 Michael Hanselmann
                                                  allocatable=allocatable)
457 fde28316 Michael Hanselmann
      self.assertEqual(7205, job_id)
458 fde28316 Michael Hanselmann
      self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
459 fde28316 Michael Hanselmann
      self.assertItems(["node-z"])
460 fde28316 Michael Hanselmann
      self.assertQuery("storage_type", ["lvm-pv"])
461 fde28316 Michael Hanselmann
      self.assertQuery("name", ["hda"])
462 fde28316 Michael Hanselmann
      self.assertQuery("allocatable", [query_allocatable])
463 95ab4de9 David Knowles
464 752df8bb Michael Hanselmann
  def testRepairNodeStorageUnits(self):
465 752df8bb Michael Hanselmann
    self.rapi.AddResponse("99")
466 752df8bb Michael Hanselmann
    self.assertEqual(99, self.client.RepairNodeStorageUnits("node-z", "lvm-pv",
467 752df8bb Michael Hanselmann
                                                            "hda"))
468 752df8bb Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_storage_repair)
469 752df8bb Michael Hanselmann
    self.assertItems(["node-z"])
470 752df8bb Michael Hanselmann
    self.assertQuery("storage_type", ["lvm-pv"])
471 752df8bb Michael Hanselmann
    self.assertQuery("name", ["hda"])
472 752df8bb Michael Hanselmann
473 95ab4de9 David Knowles
  def testGetNodeTags(self):
474 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"fry\", \"bender\"]")
475 95ab4de9 David Knowles
    self.assertEqual(["fry", "bender"], self.client.GetNodeTags("node-k"))
476 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
477 95ab4de9 David Knowles
    self.assertItems(["node-k"])
478 95ab4de9 David Knowles
479 95ab4de9 David Knowles
  def testAddNodeTags(self):
480 cab667cc David Knowles
    self.rapi.AddResponse("1234")
481 cab667cc David Knowles
    self.assertEqual(1234,
482 cab667cc David Knowles
        self.client.AddNodeTags("node-v", ["awesome"], dry_run=True))
483 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
484 95ab4de9 David Knowles
    self.assertItems(["node-v"])
485 95ab4de9 David Knowles
    self.assertDryRun()
486 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
487 95ab4de9 David Knowles
488 95ab4de9 David Knowles
  def testDeleteNodeTags(self):
489 cd577680 Michael Hanselmann
    self.rapi.AddResponse("16861")
490 cd577680 Michael Hanselmann
    self.assertEqual(16861, self.client.DeleteNodeTags("node-w", ["awesome"],
491 cd577680 Michael Hanselmann
                                                       dry_run=True))
492 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
493 95ab4de9 David Knowles
    self.assertItems(["node-w"])
494 95ab4de9 David Knowles
    self.assertDryRun()
495 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
496 95ab4de9 David Knowles
497 95ab4de9 David Knowles
498 95ab4de9 David Knowles
if __name__ == '__main__':
499 9279e986 Michael Hanselmann
  testutils.GanetiTestProgram()