Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (14.6 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 cab667cc David Knowles
    self.rapi.AddResponse("1234")
196 cab667cc David Knowles
    self.assertEqual(1234,
197 cab667cc David Knowles
        self.client.AddClusterTags(["awesome"], dry_run=True))
198 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
199 95ab4de9 David Knowles
    self.assertDryRun()
200 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
201 95ab4de9 David Knowles
202 95ab4de9 David Knowles
  def testDeleteClusterTags(self):
203 95ab4de9 David Knowles
    self.client.DeleteClusterTags(["awesome"], dry_run=True)
204 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
205 95ab4de9 David Knowles
    self.assertDryRun()
206 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
207 95ab4de9 David Knowles
208 95ab4de9 David Knowles
  def testGetInfo(self):
209 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
210 95ab4de9 David Knowles
    self.assertEqual({}, self.client.GetInfo())
211 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_info)
212 95ab4de9 David Knowles
213 95ab4de9 David Knowles
  def testGetInstances(self):
214 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
215 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstances(bulk=True))
216 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
217 95ab4de9 David Knowles
    self.assertBulk()
218 95ab4de9 David Knowles
219 95ab4de9 David Knowles
  def testGetInstanceInfo(self):
220 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
221 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstanceInfo("instance"))
222 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
223 95ab4de9 David Knowles
    self.assertItems(["instance"])
224 95ab4de9 David Knowles
225 95ab4de9 David Knowles
  def testCreateInstance(self):
226 95ab4de9 David Knowles
    self.rapi.AddResponse("1234")
227 95ab4de9 David Knowles
    self.assertEqual(1234, self.client.CreateInstance(dry_run=True))
228 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
229 95ab4de9 David Knowles
    self.assertDryRun()
230 95ab4de9 David Knowles
231 95ab4de9 David Knowles
  def testDeleteInstance(self):
232 cab667cc David Knowles
    self.rapi.AddResponse("1234")
233 cab667cc David Knowles
    self.assertEqual(1234, self.client.DeleteInstance("instance", dry_run=True))
234 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
235 95ab4de9 David Knowles
    self.assertItems(["instance"])
236 95ab4de9 David Knowles
    self.assertDryRun()
237 95ab4de9 David Knowles
238 95ab4de9 David Knowles
  def testGetInstanceTags(self):
239 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
240 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstanceTags("fooinstance"))
241 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
242 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
243 95ab4de9 David Knowles
244 95ab4de9 David Knowles
  def testAddInstanceTags(self):
245 cab667cc David Knowles
    self.rapi.AddResponse("1234")
246 cab667cc David Knowles
    self.assertEqual(1234,
247 cab667cc David Knowles
        self.client.AddInstanceTags("fooinstance", ["awesome"], dry_run=True))
248 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
249 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
250 95ab4de9 David Knowles
    self.assertDryRun()
251 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
252 95ab4de9 David Knowles
253 95ab4de9 David Knowles
  def testDeleteInstanceTags(self):
254 95ab4de9 David Knowles
    self.client.DeleteInstanceTags("foo", ["awesome"], dry_run=True)
255 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
256 95ab4de9 David Knowles
    self.assertItems(["foo"])
257 95ab4de9 David Knowles
    self.assertDryRun()
258 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
259 95ab4de9 David Knowles
260 95ab4de9 David Knowles
  def testRebootInstance(self):
261 95ab4de9 David Knowles
    self.client.RebootInstance("i-bar", reboot_type="hard",
262 95ab4de9 David Knowles
                               ignore_secondaries=True, dry_run=True)
263 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reboot)
264 95ab4de9 David Knowles
    self.assertItems(["i-bar"])
265 95ab4de9 David Knowles
    self.assertDryRun()
266 95ab4de9 David Knowles
    self.assertQuery("type", ["hard"])
267 95ab4de9 David Knowles
    self.assertQuery("ignore_secondaries", ["True"])
268 95ab4de9 David Knowles
269 95ab4de9 David Knowles
  def testShutdownInstance(self):
270 95ab4de9 David Knowles
    self.client.ShutdownInstance("foo-instance", dry_run=True)
271 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_shutdown)
272 95ab4de9 David Knowles
    self.assertItems(["foo-instance"])
273 95ab4de9 David Knowles
    self.assertDryRun()
274 95ab4de9 David Knowles
275 95ab4de9 David Knowles
  def testStartupInstance(self):
276 95ab4de9 David Knowles
    self.client.StartupInstance("bar-instance", dry_run=True)
277 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_startup)
278 95ab4de9 David Knowles
    self.assertItems(["bar-instance"])
279 95ab4de9 David Knowles
    self.assertDryRun()
280 95ab4de9 David Knowles
281 95ab4de9 David Knowles
  def testReinstallInstance(self):
282 95ab4de9 David Knowles
    self.client.ReinstallInstance("baz-instance", "DOS", no_startup=True)
283 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
284 95ab4de9 David Knowles
    self.assertItems(["baz-instance"])
285 95ab4de9 David Knowles
    self.assertQuery("os", ["DOS"])
286 95ab4de9 David Knowles
    self.assertQuery("nostartup", ["1"])
287 95ab4de9 David Knowles
288 95ab4de9 David Knowles
  def testReplaceInstanceDisks(self):
289 95ab4de9 David Knowles
    self.rapi.AddResponse("999")
290 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-name",
291 95ab4de9 David Knowles
        ["hda", "hdc"], dry_run=True)
292 95ab4de9 David Knowles
    self.assertEqual(999, job_id)
293 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_replace_disks)
294 95ab4de9 David Knowles
    self.assertItems(["instance-name"])
295 95ab4de9 David Knowles
    self.assertQuery("disks", ["hda,hdc"])
296 95ab4de9 David Knowles
    self.assertQuery("mode", ["replace_auto"])
297 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
298 95ab4de9 David Knowles
    self.assertDryRun()
299 95ab4de9 David Knowles
300 95ab4de9 David Knowles
    self.assertRaises(client.InvalidReplacementMode,
301 95ab4de9 David Knowles
                      self.client.ReplaceInstanceDisks,
302 95ab4de9 David Knowles
                      "instance_a", ["hda"], mode="invalid_mode")
303 95ab4de9 David Knowles
    self.assertRaises(client.GanetiApiError,
304 95ab4de9 David Knowles
                      self.client.ReplaceInstanceDisks,
305 95ab4de9 David Knowles
                      "instance-foo", ["hda"], mode="replace_on_secondary")
306 95ab4de9 David Knowles
307 95ab4de9 David Knowles
    self.rapi.AddResponse("1000")
308 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-bar",
309 95ab4de9 David Knowles
        ["hda"], mode="replace_on_secondary", remote_node="foo-node",
310 95ab4de9 David Knowles
        dry_run=True)
311 95ab4de9 David Knowles
    self.assertEqual(1000, job_id)
312 95ab4de9 David Knowles
    self.assertItems(["instance-bar"])
313 95ab4de9 David Knowles
    self.assertQuery("disks", ["hda"])
314 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["foo-node"])
315 95ab4de9 David Knowles
    self.assertDryRun()
316 95ab4de9 David Knowles
317 95ab4de9 David Knowles
  def testGetJobs(self):
318 2004e673 Iustin Pop
    self.rapi.AddResponse('[ { "id": "123", "uri": "\\/2\\/jobs\\/123" },'
319 2004e673 Iustin Pop
                          '  { "id": "124", "uri": "\\/2\\/jobs\\/124" } ]')
320 95ab4de9 David Knowles
    self.assertEqual([123, 124], self.client.GetJobs())
321 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs)
322 95ab4de9 David Knowles
323 95ab4de9 David Knowles
  def testGetJobStatus(self):
324 95ab4de9 David Knowles
    self.rapi.AddResponse("{\"foo\": \"bar\"}")
325 95ab4de9 David Knowles
    self.assertEqual({"foo": "bar"}, self.client.GetJobStatus(1234))
326 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
327 95ab4de9 David Knowles
    self.assertItems(["1234"])
328 95ab4de9 David Knowles
329 95ab4de9 David Knowles
  def testDeleteJob(self):
330 95ab4de9 David Knowles
    self.client.DeleteJob(999, dry_run=True)
331 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
332 95ab4de9 David Knowles
    self.assertItems(["999"])
333 95ab4de9 David Knowles
    self.assertDryRun()
334 95ab4de9 David Knowles
335 95ab4de9 David Knowles
  def testGetNodes(self):
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(["node1", "node2"], self.client.GetNodes())
339 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
340 95ab4de9 David Knowles
341 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
342 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
343 95ab4de9 David Knowles
    self.assertEqual([{"id": "node1", "uri": "uri1"},
344 95ab4de9 David Knowles
                      {"id": "node2", "uri": "uri2"}],
345 95ab4de9 David Knowles
                     self.client.GetNodes(bulk=True))
346 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
347 95ab4de9 David Knowles
    self.assertBulk()
348 95ab4de9 David Knowles
349 95ab4de9 David Knowles
  def testGetNodeInfo(self):
350 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
351 95ab4de9 David Knowles
    self.assertEqual({}, self.client.GetNodeInfo("node-foo"))
352 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name)
353 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
354 95ab4de9 David Knowles
355 95ab4de9 David Knowles
  def testEvacuateNode(self):
356 95ab4de9 David Knowles
    self.rapi.AddResponse("9876")
357 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-1", remote_node="node-2")
358 95ab4de9 David Knowles
    self.assertEqual(9876, job_id)
359 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_evacuate)
360 95ab4de9 David Knowles
    self.assertItems(["node-1"])
361 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["node-2"])
362 95ab4de9 David Knowles
363 95ab4de9 David Knowles
    self.rapi.AddResponse("8888")
364 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-3", iallocator="hail", dry_run=True)
365 95ab4de9 David Knowles
    self.assertEqual(8888, job_id)
366 95ab4de9 David Knowles
    self.assertItems(["node-3"])
367 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
368 95ab4de9 David Knowles
    self.assertDryRun()
369 95ab4de9 David Knowles
370 95ab4de9 David Knowles
    self.assertRaises(client.GanetiApiError,
371 95ab4de9 David Knowles
                      self.client.EvacuateNode,
372 95ab4de9 David Knowles
                      "node-4", iallocator="hail", remote_node="node-5")
373 95ab4de9 David Knowles
374 95ab4de9 David Knowles
  def testMigrateNode(self):
375 95ab4de9 David Knowles
    self.rapi.AddResponse("1111")
376 95ab4de9 David Knowles
    self.assertEqual(1111, self.client.MigrateNode("node-a", dry_run=True))
377 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
378 95ab4de9 David Knowles
    self.assertItems(["node-a"])
379 95ab4de9 David Knowles
    self.assertQuery("live", ["1"])
380 95ab4de9 David Knowles
    self.assertDryRun()
381 95ab4de9 David Knowles
382 95ab4de9 David Knowles
  def testGetNodeRole(self):
383 95ab4de9 David Knowles
    self.rapi.AddResponse("\"master\"")
384 95ab4de9 David Knowles
    self.assertEqual("master", self.client.GetNodeRole("node-a"))
385 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
386 95ab4de9 David Knowles
    self.assertItems(["node-a"])
387 95ab4de9 David Knowles
388 95ab4de9 David Knowles
  def testSetNodeRole(self):
389 95ab4de9 David Knowles
    self.rapi.AddResponse("789")
390 95ab4de9 David Knowles
    self.assertEqual(789,
391 95ab4de9 David Knowles
        self.client.SetNodeRole("node-foo", "master-candidate", force=True))
392 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
393 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
394 95ab4de9 David Knowles
    self.assertQuery("force", ["True"])
395 95ab4de9 David Knowles
    self.assertEqual("master-candidate", self.http.last_request_body)
396 95ab4de9 David Knowles
397 95ab4de9 David Knowles
    self.assertRaises(client.InvalidNodeRole,
398 95ab4de9 David Knowles
                      self.client.SetNodeRole, "node-bar", "fake-role")
399 95ab4de9 David Knowles
400 95ab4de9 David Knowles
  def testGetNodeStorageUnits(self):
401 95ab4de9 David Knowles
    self.rapi.AddResponse("42")
402 95ab4de9 David Knowles
    self.assertEqual(42,
403 95ab4de9 David Knowles
        self.client.GetNodeStorageUnits("node-x", "lvm-pv", "fields"))
404 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage)
405 95ab4de9 David Knowles
    self.assertItems(["node-x"])
406 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
407 95ab4de9 David Knowles
    self.assertQuery("output_fields", ["fields"])
408 95ab4de9 David Knowles
409 95ab4de9 David Knowles
    self.assertRaises(client.InvalidStorageType,
410 95ab4de9 David Knowles
                      self.client.GetNodeStorageUnits,
411 95ab4de9 David Knowles
                      "node-y", "floppy-disk", "fields")
412 95ab4de9 David Knowles
413 95ab4de9 David Knowles
  def testModifyNodeStorageUnits(self):
414 95ab4de9 David Knowles
    self.rapi.AddResponse("14")
415 95ab4de9 David Knowles
    self.assertEqual(14,
416 95ab4de9 David Knowles
        self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda"))
417 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
418 95ab4de9 David Knowles
    self.assertItems(["node-z"])
419 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
420 95ab4de9 David Knowles
    self.assertQuery("name", ["hda"])
421 95ab4de9 David Knowles
422 95ab4de9 David Knowles
    self.assertRaises(client.InvalidStorageType,
423 95ab4de9 David Knowles
                      self.client.ModifyNodeStorageUnits,
424 95ab4de9 David Knowles
                      "node-n", "floppy-disk", "hdc")
425 95ab4de9 David Knowles
426 95ab4de9 David Knowles
  def testGetNodeTags(self):
427 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"fry\", \"bender\"]")
428 95ab4de9 David Knowles
    self.assertEqual(["fry", "bender"], self.client.GetNodeTags("node-k"))
429 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
430 95ab4de9 David Knowles
    self.assertItems(["node-k"])
431 95ab4de9 David Knowles
432 95ab4de9 David Knowles
  def testAddNodeTags(self):
433 cab667cc David Knowles
    self.rapi.AddResponse("1234")
434 cab667cc David Knowles
    self.assertEqual(1234,
435 cab667cc David Knowles
        self.client.AddNodeTags("node-v", ["awesome"], dry_run=True))
436 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
437 95ab4de9 David Knowles
    self.assertItems(["node-v"])
438 95ab4de9 David Knowles
    self.assertDryRun()
439 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
440 95ab4de9 David Knowles
441 95ab4de9 David Knowles
  def testDeleteNodeTags(self):
442 95ab4de9 David Knowles
    self.client.DeleteNodeTags("node-w", ["awesome"], dry_run=True)
443 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
444 95ab4de9 David Knowles
    self.assertItems(["node-w"])
445 95ab4de9 David Knowles
    self.assertDryRun()
446 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
447 95ab4de9 David Knowles
448 95ab4de9 David Knowles
449 95ab4de9 David Knowles
if __name__ == '__main__':
450 95ab4de9 David Knowles
  if httplib2 is None:
451 95ab4de9 David Knowles
    warnings.warn("These tests require the httplib2 library")
452 95ab4de9 David Knowles
  else:
453 95ab4de9 David Knowles
    testutils.GanetiTestProgram()