Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rapi.client_unittest.py @ 95ab4de9

History | View | Annotate | Download (14.3 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
try:
26 95ab4de9 David Knowles
  import httplib2
27 95ab4de9 David Knowles
  BaseHttp = httplib2.Http
28 95ab4de9 David Knowles
  from ganeti.rapi import client
29 95ab4de9 David Knowles
except ImportError:
30 95ab4de9 David Knowles
  httplib2 = None
31 95ab4de9 David Knowles
  BaseHttp = object
32 95ab4de9 David Knowles
33 95ab4de9 David Knowles
import re
34 95ab4de9 David Knowles
import unittest
35 95ab4de9 David Knowles
import warnings
36 95ab4de9 David Knowles
37 95ab4de9 David Knowles
from ganeti import http
38 95ab4de9 David Knowles
39 95ab4de9 David Knowles
from ganeti.rapi import connector
40 95ab4de9 David Knowles
from ganeti.rapi import rlib2
41 95ab4de9 David Knowles
42 95ab4de9 David Knowles
import testutils
43 95ab4de9 David Knowles
44 95ab4de9 David Knowles
45 95ab4de9 David Knowles
_URI_RE = re.compile(r"https://(?P<host>.*):(?P<port>\d+)(?P<path>/.*)")
46 95ab4de9 David Knowles
47 95ab4de9 David Knowles
48 95ab4de9 David Knowles
def _GetPathFromUri(uri):
49 95ab4de9 David Knowles
  """Gets the path and query from a URI.
50 95ab4de9 David Knowles

51 95ab4de9 David Knowles
  """
52 95ab4de9 David Knowles
  match = _URI_RE.match(uri)
53 95ab4de9 David Knowles
  if match:
54 95ab4de9 David Knowles
    return match.groupdict()["path"]
55 95ab4de9 David Knowles
  else:
56 95ab4de9 David Knowles
    return None
57 95ab4de9 David Knowles
58 95ab4de9 David Knowles
59 95ab4de9 David Knowles
class HttpResponseMock(dict):
60 95ab4de9 David Knowles
  """Dumb mock of httplib2.Response.
61 95ab4de9 David Knowles

62 95ab4de9 David Knowles
  """
63 95ab4de9 David Knowles
64 95ab4de9 David Knowles
  def __init__(self, status):
65 95ab4de9 David Knowles
    self.status = status
66 95ab4de9 David Knowles
    self['status'] = status
67 95ab4de9 David Knowles
68 95ab4de9 David Knowles
69 95ab4de9 David Knowles
class HttpMock(BaseHttp):
70 95ab4de9 David Knowles
  """Mock for httplib.Http.
71 95ab4de9 David Knowles

72 95ab4de9 David Knowles
  """
73 95ab4de9 David Knowles
74 95ab4de9 David Knowles
  def __init__(self, rapi):
75 95ab4de9 David Knowles
    self._rapi = rapi
76 95ab4de9 David Knowles
    self._last_request = None
77 95ab4de9 David Knowles
78 95ab4de9 David Knowles
  last_request_url = property(lambda self: self._last_request[0])
79 95ab4de9 David Knowles
  last_request_method = property(lambda self: self._last_request[1])
80 95ab4de9 David Knowles
  last_request_body = property(lambda self: self._last_request[2])
81 95ab4de9 David Knowles
82 95ab4de9 David Knowles
  def request(self, url, method, body, headers):
83 95ab4de9 David Knowles
    self._last_request = (url, method, body)
84 95ab4de9 David Knowles
    code, resp_body = self._rapi.FetchResponse(_GetPathFromUri(url), method)
85 95ab4de9 David Knowles
    return HttpResponseMock(code), resp_body
86 95ab4de9 David Knowles
87 95ab4de9 David Knowles
88 95ab4de9 David Knowles
class RapiMock(object):
89 95ab4de9 David Knowles
90 95ab4de9 David Knowles
  def __init__(self):
91 95ab4de9 David Knowles
    self._mapper = connector.Mapper()
92 95ab4de9 David Knowles
    self._responses = []
93 95ab4de9 David Knowles
    self._last_handler = None
94 95ab4de9 David Knowles
95 95ab4de9 David Knowles
  def AddResponse(self, response):
96 95ab4de9 David Knowles
    self._responses.insert(0, response)
97 95ab4de9 David Knowles
98 95ab4de9 David Knowles
  def PopResponse(self):
99 95ab4de9 David Knowles
    if len(self._responses) > 0:
100 95ab4de9 David Knowles
      return self._responses.pop()
101 95ab4de9 David Knowles
    else:
102 95ab4de9 David Knowles
      return None
103 95ab4de9 David Knowles
104 95ab4de9 David Knowles
  def GetLastHandler(self):
105 95ab4de9 David Knowles
    return self._last_handler
106 95ab4de9 David Knowles
107 95ab4de9 David Knowles
  def FetchResponse(self, path, method):
108 95ab4de9 David Knowles
    code = 200
109 95ab4de9 David Knowles
    response = None
110 95ab4de9 David Knowles
111 95ab4de9 David Knowles
    try:
112 95ab4de9 David Knowles
      HandlerClass, items, args = self._mapper.getController(path)
113 95ab4de9 David Knowles
      self._last_handler = HandlerClass(items, args, None)
114 95ab4de9 David Knowles
      if not hasattr(self._last_handler, method.upper()):
115 95ab4de9 David Knowles
        code = 400
116 95ab4de9 David Knowles
        response = "Bad request"
117 95ab4de9 David Knowles
    except http.HttpException, ex:
118 95ab4de9 David Knowles
      code = ex.code
119 95ab4de9 David Knowles
      response = ex.message
120 95ab4de9 David Knowles
121 95ab4de9 David Knowles
    if not response:
122 95ab4de9 David Knowles
      response = self.PopResponse()
123 95ab4de9 David Knowles
124 95ab4de9 David Knowles
    return code, response
125 95ab4de9 David Knowles
126 95ab4de9 David Knowles
127 95ab4de9 David Knowles
class RapiMockTest(unittest.TestCase):
128 95ab4de9 David Knowles
129 95ab4de9 David Knowles
  def test(self):
130 95ab4de9 David Knowles
    rapi = RapiMock()
131 95ab4de9 David Knowles
    path = "/version"
132 95ab4de9 David Knowles
    self.assertEqual((404, None), rapi.FetchResponse("/foo", "GET"))
133 95ab4de9 David Knowles
    self.assertEqual((400, "Bad request"),
134 95ab4de9 David Knowles
                     rapi.FetchResponse("/version", "POST"))
135 95ab4de9 David Knowles
    rapi.AddResponse("2")
136 95ab4de9 David Knowles
    code, response = rapi.FetchResponse("/version", "GET")
137 95ab4de9 David Knowles
    self.assertEqual(200, code)
138 95ab4de9 David Knowles
    self.assertEqual("2", response)
139 95ab4de9 David Knowles
    self.failUnless(isinstance(rapi.GetLastHandler(), rlib2.R_version))
140 95ab4de9 David Knowles
141 95ab4de9 David Knowles
142 95ab4de9 David Knowles
class GanetiRapiClientTests(unittest.TestCase):
143 95ab4de9 David Knowles
  """Tests for remote API client.
144 95ab4de9 David Knowles

145 95ab4de9 David Knowles
  """
146 95ab4de9 David Knowles
147 95ab4de9 David Knowles
  def setUp(self):
148 95ab4de9 David Knowles
    # Monkey-patch a fake VerifyCertificate function
149 95ab4de9 David Knowles
    self._verify_certificate = client._VerifyCertificate
150 95ab4de9 David Knowles
    client._VerifyCertificate = lambda x, y, z: True
151 95ab4de9 David Knowles
152 95ab4de9 David Knowles
    self.rapi = RapiMock()
153 95ab4de9 David Knowles
    self.http = HttpMock(self.rapi)
154 95ab4de9 David Knowles
    self.client = client.GanetiRapiClient('master.foo.com')
155 95ab4de9 David Knowles
    self.client._http = self.http
156 95ab4de9 David Knowles
    # Hard-code the version for easier testing.
157 95ab4de9 David Knowles
    self.client._version = 2
158 95ab4de9 David Knowles
159 95ab4de9 David Knowles
  def tearDown(self):
160 95ab4de9 David Knowles
    # Un-do the monkey-patch
161 95ab4de9 David Knowles
    client._VerifyCertificate = self._verify_certificate
162 95ab4de9 David Knowles
163 95ab4de9 David Knowles
  def assertHandler(self, handler_cls):
164 95ab4de9 David Knowles
    self.failUnless(isinstance(self.rapi.GetLastHandler(), handler_cls))
165 95ab4de9 David Knowles
166 95ab4de9 David Knowles
  def assertQuery(self, key, value):
167 95ab4de9 David Knowles
    self.assertEqual(value, self.rapi.GetLastHandler().queryargs.get(key, None))
168 95ab4de9 David Knowles
169 95ab4de9 David Knowles
  def assertItems(self, items):
170 95ab4de9 David Knowles
    self.assertEqual(items, self.rapi.GetLastHandler().items)
171 95ab4de9 David Knowles
172 95ab4de9 David Knowles
  def assertBulk(self):
173 95ab4de9 David Knowles
    self.assertTrue(self.rapi.GetLastHandler().useBulk())
174 95ab4de9 David Knowles
175 95ab4de9 David Knowles
  def assertDryRun(self):
176 95ab4de9 David Knowles
    self.assertTrue(self.rapi.GetLastHandler().dryRun())
177 95ab4de9 David Knowles
178 95ab4de9 David Knowles
  def testGetVersion(self):
179 95ab4de9 David Knowles
    self.client._version = None
180 95ab4de9 David Knowles
    self.rapi.AddResponse("2")
181 95ab4de9 David Knowles
    self.assertEqual(2, self.client.GetVersion())
182 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_version)
183 95ab4de9 David Knowles
184 95ab4de9 David Knowles
  def testGetOperatingSystems(self):
185 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"beos\"]")
186 95ab4de9 David Knowles
    self.assertEqual(["beos"], self.client.GetOperatingSystems())
187 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_os)
188 95ab4de9 David Knowles
189 95ab4de9 David Knowles
  def testGetClusterTags(self):
190 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"tag\"]")
191 95ab4de9 David Knowles
    self.assertEqual(["tag"], self.client.GetClusterTags())
192 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
193 95ab4de9 David Knowles
194 95ab4de9 David Knowles
  def testAddClusterTags(self):
195 95ab4de9 David Knowles
    self.client.AddClusterTags(["awesome"], dry_run=True)
196 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
197 95ab4de9 David Knowles
    self.assertDryRun()
198 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
199 95ab4de9 David Knowles
200 95ab4de9 David Knowles
  def testDeleteClusterTags(self):
201 95ab4de9 David Knowles
    self.client.DeleteClusterTags(["awesome"], dry_run=True)
202 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
203 95ab4de9 David Knowles
    self.assertDryRun()
204 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
205 95ab4de9 David Knowles
206 95ab4de9 David Knowles
  def testGetInfo(self):
207 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
208 95ab4de9 David Knowles
    self.assertEqual({}, self.client.GetInfo())
209 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_info)
210 95ab4de9 David Knowles
211 95ab4de9 David Knowles
  def testGetInstances(self):
212 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
213 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstances(bulk=True))
214 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
215 95ab4de9 David Knowles
    self.assertBulk()
216 95ab4de9 David Knowles
217 95ab4de9 David Knowles
  def testGetInstanceInfo(self):
218 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
219 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstanceInfo("instance"))
220 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
221 95ab4de9 David Knowles
    self.assertItems(["instance"])
222 95ab4de9 David Knowles
223 95ab4de9 David Knowles
  def testCreateInstance(self):
224 95ab4de9 David Knowles
    self.rapi.AddResponse("1234")
225 95ab4de9 David Knowles
    self.assertEqual(1234, self.client.CreateInstance(dry_run=True))
226 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
227 95ab4de9 David Knowles
    self.assertDryRun()
228 95ab4de9 David Knowles
229 95ab4de9 David Knowles
  def testDeleteInstance(self):
230 95ab4de9 David Knowles
    self.client.DeleteInstance("instance", dry_run=True)
231 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
232 95ab4de9 David Knowles
    self.assertItems(["instance"])
233 95ab4de9 David Knowles
    self.assertDryRun()
234 95ab4de9 David Knowles
235 95ab4de9 David Knowles
  def testGetInstanceTags(self):
236 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
237 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstanceTags("fooinstance"))
238 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
239 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
240 95ab4de9 David Knowles
241 95ab4de9 David Knowles
  def testAddInstanceTags(self):
242 95ab4de9 David Knowles
    self.client.AddInstanceTags("fooinstance", ["awesome"], dry_run=True)
243 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
244 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
245 95ab4de9 David Knowles
    self.assertDryRun()
246 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
247 95ab4de9 David Knowles
248 95ab4de9 David Knowles
  def testDeleteInstanceTags(self):
249 95ab4de9 David Knowles
    self.client.DeleteInstanceTags("foo", ["awesome"], dry_run=True)
250 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
251 95ab4de9 David Knowles
    self.assertItems(["foo"])
252 95ab4de9 David Knowles
    self.assertDryRun()
253 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
254 95ab4de9 David Knowles
255 95ab4de9 David Knowles
  def testRebootInstance(self):
256 95ab4de9 David Knowles
    self.client.RebootInstance("i-bar", reboot_type="hard",
257 95ab4de9 David Knowles
                               ignore_secondaries=True, dry_run=True)
258 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reboot)
259 95ab4de9 David Knowles
    self.assertItems(["i-bar"])
260 95ab4de9 David Knowles
    self.assertDryRun()
261 95ab4de9 David Knowles
    self.assertQuery("type", ["hard"])
262 95ab4de9 David Knowles
    self.assertQuery("ignore_secondaries", ["True"])
263 95ab4de9 David Knowles
264 95ab4de9 David Knowles
  def testShutdownInstance(self):
265 95ab4de9 David Knowles
    self.client.ShutdownInstance("foo-instance", dry_run=True)
266 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_shutdown)
267 95ab4de9 David Knowles
    self.assertItems(["foo-instance"])
268 95ab4de9 David Knowles
    self.assertDryRun()
269 95ab4de9 David Knowles
270 95ab4de9 David Knowles
  def testStartupInstance(self):
271 95ab4de9 David Knowles
    self.client.StartupInstance("bar-instance", 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 95ab4de9 David Knowles
    self.client.ReinstallInstance("baz-instance", "DOS", no_startup=True)
278 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
279 95ab4de9 David Knowles
    self.assertItems(["baz-instance"])
280 95ab4de9 David Knowles
    self.assertQuery("os", ["DOS"])
281 95ab4de9 David Knowles
    self.assertQuery("nostartup", ["1"])
282 95ab4de9 David Knowles
283 95ab4de9 David Knowles
  def testReplaceInstanceDisks(self):
284 95ab4de9 David Knowles
    self.rapi.AddResponse("999")
285 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-name",
286 95ab4de9 David Knowles
        ["hda", "hdc"], dry_run=True)
287 95ab4de9 David Knowles
    self.assertEqual(999, job_id)
288 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_replace_disks)
289 95ab4de9 David Knowles
    self.assertItems(["instance-name"])
290 95ab4de9 David Knowles
    self.assertQuery("disks", ["hda,hdc"])
291 95ab4de9 David Knowles
    self.assertQuery("mode", ["replace_auto"])
292 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
293 95ab4de9 David Knowles
    self.assertDryRun()
294 95ab4de9 David Knowles
295 95ab4de9 David Knowles
    self.assertRaises(client.InvalidReplacementMode,
296 95ab4de9 David Knowles
                      self.client.ReplaceInstanceDisks,
297 95ab4de9 David Knowles
                      "instance_a", ["hda"], mode="invalid_mode")
298 95ab4de9 David Knowles
    self.assertRaises(client.GanetiApiError,
299 95ab4de9 David Knowles
                      self.client.ReplaceInstanceDisks,
300 95ab4de9 David Knowles
                      "instance-foo", ["hda"], mode="replace_on_secondary")
301 95ab4de9 David Knowles
302 95ab4de9 David Knowles
    self.rapi.AddResponse("1000")
303 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-bar",
304 95ab4de9 David Knowles
        ["hda"], mode="replace_on_secondary", remote_node="foo-node",
305 95ab4de9 David Knowles
        dry_run=True)
306 95ab4de9 David Knowles
    self.assertEqual(1000, job_id)
307 95ab4de9 David Knowles
    self.assertItems(["instance-bar"])
308 95ab4de9 David Knowles
    self.assertQuery("disks", ["hda"])
309 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["foo-node"])
310 95ab4de9 David Knowles
    self.assertDryRun()
311 95ab4de9 David Knowles
312 95ab4de9 David Knowles
  def testGetJobs(self):
313 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"123\", \"uri\": \"\/2\/jobs\/123\" },"
314 95ab4de9 David Knowles
                          " { \"id\": \"124\", \"uri\": \"\2\/jobs\/124\" } ]")
315 95ab4de9 David Knowles
    self.assertEqual([123, 124], self.client.GetJobs())
316 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs)
317 95ab4de9 David Knowles
318 95ab4de9 David Knowles
  def testGetJobStatus(self):
319 95ab4de9 David Knowles
    self.rapi.AddResponse("{\"foo\": \"bar\"}")
320 95ab4de9 David Knowles
    self.assertEqual({"foo": "bar"}, self.client.GetJobStatus(1234))
321 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
322 95ab4de9 David Knowles
    self.assertItems(["1234"])
323 95ab4de9 David Knowles
324 95ab4de9 David Knowles
  def testDeleteJob(self):
325 95ab4de9 David Knowles
    self.client.DeleteJob(999, dry_run=True)
326 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
327 95ab4de9 David Knowles
    self.assertItems(["999"])
328 95ab4de9 David Knowles
    self.assertDryRun()
329 95ab4de9 David Knowles
330 95ab4de9 David Knowles
  def testGetNodes(self):
331 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
332 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
333 95ab4de9 David Knowles
    self.assertEqual(["node1", "node2"], self.client.GetNodes())
334 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
335 95ab4de9 David Knowles
336 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
337 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
338 95ab4de9 David Knowles
    self.assertEqual([{"id": "node1", "uri": "uri1"},
339 95ab4de9 David Knowles
                      {"id": "node2", "uri": "uri2"}],
340 95ab4de9 David Knowles
                     self.client.GetNodes(bulk=True))
341 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
342 95ab4de9 David Knowles
    self.assertBulk()
343 95ab4de9 David Knowles
344 95ab4de9 David Knowles
  def testGetNodeInfo(self):
345 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
346 95ab4de9 David Knowles
    self.assertEqual({}, self.client.GetNodeInfo("node-foo"))
347 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name)
348 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
349 95ab4de9 David Knowles
350 95ab4de9 David Knowles
  def testEvacuateNode(self):
351 95ab4de9 David Knowles
    self.rapi.AddResponse("9876")
352 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-1", remote_node="node-2")
353 95ab4de9 David Knowles
    self.assertEqual(9876, job_id)
354 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_evacuate)
355 95ab4de9 David Knowles
    self.assertItems(["node-1"])
356 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["node-2"])
357 95ab4de9 David Knowles
358 95ab4de9 David Knowles
    self.rapi.AddResponse("8888")
359 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-3", iallocator="hail", dry_run=True)
360 95ab4de9 David Knowles
    self.assertEqual(8888, job_id)
361 95ab4de9 David Knowles
    self.assertItems(["node-3"])
362 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
363 95ab4de9 David Knowles
    self.assertDryRun()
364 95ab4de9 David Knowles
365 95ab4de9 David Knowles
    self.assertRaises(client.GanetiApiError,
366 95ab4de9 David Knowles
                      self.client.EvacuateNode,
367 95ab4de9 David Knowles
                      "node-4", iallocator="hail", remote_node="node-5")
368 95ab4de9 David Knowles
369 95ab4de9 David Knowles
  def testMigrateNode(self):
370 95ab4de9 David Knowles
    self.rapi.AddResponse("1111")
371 95ab4de9 David Knowles
    self.assertEqual(1111, self.client.MigrateNode("node-a", dry_run=True))
372 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
373 95ab4de9 David Knowles
    self.assertItems(["node-a"])
374 95ab4de9 David Knowles
    self.assertQuery("live", ["1"])
375 95ab4de9 David Knowles
    self.assertDryRun()
376 95ab4de9 David Knowles
377 95ab4de9 David Knowles
  def testGetNodeRole(self):
378 95ab4de9 David Knowles
    self.rapi.AddResponse("\"master\"")
379 95ab4de9 David Knowles
    self.assertEqual("master", self.client.GetNodeRole("node-a"))
380 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
381 95ab4de9 David Knowles
    self.assertItems(["node-a"])
382 95ab4de9 David Knowles
383 95ab4de9 David Knowles
  def testSetNodeRole(self):
384 95ab4de9 David Knowles
    self.rapi.AddResponse("789")
385 95ab4de9 David Knowles
    self.assertEqual(789,
386 95ab4de9 David Knowles
        self.client.SetNodeRole("node-foo", "master-candidate", force=True))
387 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
388 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
389 95ab4de9 David Knowles
    self.assertQuery("force", ["True"])
390 95ab4de9 David Knowles
    self.assertEqual("master-candidate", self.http.last_request_body)
391 95ab4de9 David Knowles
392 95ab4de9 David Knowles
    self.assertRaises(client.InvalidNodeRole,
393 95ab4de9 David Knowles
                      self.client.SetNodeRole, "node-bar", "fake-role")
394 95ab4de9 David Knowles
395 95ab4de9 David Knowles
  def testGetNodeStorageUnits(self):
396 95ab4de9 David Knowles
    self.rapi.AddResponse("42")
397 95ab4de9 David Knowles
    self.assertEqual(42,
398 95ab4de9 David Knowles
        self.client.GetNodeStorageUnits("node-x", "lvm-pv", "fields"))
399 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage)
400 95ab4de9 David Knowles
    self.assertItems(["node-x"])
401 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
402 95ab4de9 David Knowles
    self.assertQuery("output_fields", ["fields"])
403 95ab4de9 David Knowles
404 95ab4de9 David Knowles
    self.assertRaises(client.InvalidStorageType,
405 95ab4de9 David Knowles
                      self.client.GetNodeStorageUnits,
406 95ab4de9 David Knowles
                      "node-y", "floppy-disk", "fields")
407 95ab4de9 David Knowles
408 95ab4de9 David Knowles
  def testModifyNodeStorageUnits(self):
409 95ab4de9 David Knowles
    self.rapi.AddResponse("14")
410 95ab4de9 David Knowles
    self.assertEqual(14,
411 95ab4de9 David Knowles
        self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda"))
412 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
413 95ab4de9 David Knowles
    self.assertItems(["node-z"])
414 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
415 95ab4de9 David Knowles
    self.assertQuery("name", ["hda"])
416 95ab4de9 David Knowles
417 95ab4de9 David Knowles
    self.assertRaises(client.InvalidStorageType,
418 95ab4de9 David Knowles
                      self.client.ModifyNodeStorageUnits,
419 95ab4de9 David Knowles
                      "node-n", "floppy-disk", "hdc")
420 95ab4de9 David Knowles
421 95ab4de9 David Knowles
  def testGetNodeTags(self):
422 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"fry\", \"bender\"]")
423 95ab4de9 David Knowles
    self.assertEqual(["fry", "bender"], self.client.GetNodeTags("node-k"))
424 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
425 95ab4de9 David Knowles
    self.assertItems(["node-k"])
426 95ab4de9 David Knowles
427 95ab4de9 David Knowles
  def testAddNodeTags(self):
428 95ab4de9 David Knowles
    self.client.AddNodeTags("node-v", ["awesome"], dry_run=True)
429 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
430 95ab4de9 David Knowles
    self.assertItems(["node-v"])
431 95ab4de9 David Knowles
    self.assertDryRun()
432 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
433 95ab4de9 David Knowles
434 95ab4de9 David Knowles
  def testDeleteNodeTags(self):
435 95ab4de9 David Knowles
    self.client.DeleteNodeTags("node-w", ["awesome"], dry_run=True)
436 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
437 95ab4de9 David Knowles
    self.assertItems(["node-w"])
438 95ab4de9 David Knowles
    self.assertDryRun()
439 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
440 95ab4de9 David Knowles
441 95ab4de9 David Knowles
442 95ab4de9 David Knowles
if __name__ == '__main__':
443 95ab4de9 David Knowles
  if httplib2 is None:
444 95ab4de9 David Knowles
    warnings.warn("These tests require the httplib2 library")
445 95ab4de9 David Knowles
  else:
446 95ab4de9 David Knowles
    testutils.GanetiTestProgram()