Statistics
| Branch: | Tag: | Revision:

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

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