Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rapi.client_unittest.py @ 1d3dfa29

History | View | Annotate | Download (19.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
  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 7eac4a4d Michael Hanselmann
  def testGetFeatures(self):
194 7eac4a4d Michael Hanselmann
    for features in [[], ["foo", "bar", "baz"]]:
195 7eac4a4d Michael Hanselmann
      self.rapi.AddResponse(serializer.DumpJson(features))
196 7eac4a4d Michael Hanselmann
      self.assertEqual(features, self.client.GetFeatures())
197 7eac4a4d Michael Hanselmann
      self.assertHandler(rlib2.R_2_features)
198 7eac4a4d Michael Hanselmann
199 95ab4de9 David Knowles
  def testGetOperatingSystems(self):
200 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"beos\"]")
201 95ab4de9 David Knowles
    self.assertEqual(["beos"], self.client.GetOperatingSystems())
202 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_os)
203 95ab4de9 David Knowles
204 95ab4de9 David Knowles
  def testGetClusterTags(self):
205 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"tag\"]")
206 95ab4de9 David Knowles
    self.assertEqual(["tag"], self.client.GetClusterTags())
207 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
208 95ab4de9 David Knowles
209 95ab4de9 David Knowles
  def testAddClusterTags(self):
210 cab667cc David Knowles
    self.rapi.AddResponse("1234")
211 cab667cc David Knowles
    self.assertEqual(1234,
212 cab667cc David Knowles
        self.client.AddClusterTags(["awesome"], dry_run=True))
213 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
214 95ab4de9 David Knowles
    self.assertDryRun()
215 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
216 95ab4de9 David Knowles
217 95ab4de9 David Knowles
  def testDeleteClusterTags(self):
218 cd577680 Michael Hanselmann
    self.rapi.AddResponse("5107")
219 cd577680 Michael Hanselmann
    self.assertEqual(5107, self.client.DeleteClusterTags(["awesome"],
220 cd577680 Michael Hanselmann
                                                         dry_run=True))
221 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
222 95ab4de9 David Knowles
    self.assertDryRun()
223 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
224 95ab4de9 David Knowles
225 95ab4de9 David Knowles
  def testGetInfo(self):
226 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
227 95ab4de9 David Knowles
    self.assertEqual({}, self.client.GetInfo())
228 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_info)
229 95ab4de9 David Knowles
230 95ab4de9 David Knowles
  def testGetInstances(self):
231 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
232 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstances(bulk=True))
233 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
234 95ab4de9 David Knowles
    self.assertBulk()
235 95ab4de9 David Knowles
236 591e5103 Michael Hanselmann
  def testGetInstance(self):
237 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
238 591e5103 Michael Hanselmann
    self.assertEqual([], self.client.GetInstance("instance"))
239 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
240 95ab4de9 David Knowles
    self.assertItems(["instance"])
241 95ab4de9 David Knowles
242 591e5103 Michael Hanselmann
  def testGetInstanceInfo(self):
243 591e5103 Michael Hanselmann
    self.rapi.AddResponse("21291")
244 591e5103 Michael Hanselmann
    self.assertEqual(21291, self.client.GetInstanceInfo("inst3"))
245 591e5103 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_info)
246 591e5103 Michael Hanselmann
    self.assertItems(["inst3"])
247 591e5103 Michael Hanselmann
    self.assertQuery("static", None)
248 591e5103 Michael Hanselmann
249 591e5103 Michael Hanselmann
    self.rapi.AddResponse("3428")
250 591e5103 Michael Hanselmann
    self.assertEqual(3428, self.client.GetInstanceInfo("inst31", static=False))
251 591e5103 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_info)
252 591e5103 Michael Hanselmann
    self.assertItems(["inst31"])
253 591e5103 Michael Hanselmann
    self.assertQuery("static", ["0"])
254 591e5103 Michael Hanselmann
255 591e5103 Michael Hanselmann
    self.rapi.AddResponse("15665")
256 591e5103 Michael Hanselmann
    self.assertEqual(15665, self.client.GetInstanceInfo("inst32", static=True))
257 591e5103 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_info)
258 591e5103 Michael Hanselmann
    self.assertItems(["inst32"])
259 591e5103 Michael Hanselmann
    self.assertQuery("static", ["1"])
260 591e5103 Michael Hanselmann
261 8a47b447 Michael Hanselmann
  def testCreateInstanceOldVersion(self):
262 8a47b447 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
263 8a47b447 Michael Hanselmann
    self.assertRaises(NotImplementedError, self.client.CreateInstance,
264 8a47b447 Michael Hanselmann
                      "create", "inst1.example.com", "plain", [], [],
265 8a47b447 Michael Hanselmann
                      dry_run=True)
266 8a47b447 Michael Hanselmann
267 95ab4de9 David Knowles
  def testCreateInstance(self):
268 8a47b447 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_CREATE_REQV1]))
269 8a47b447 Michael Hanselmann
    self.rapi.AddResponse("23030")
270 8a47b447 Michael Hanselmann
    job_id = self.client.CreateInstance("create", "inst1.example.com",
271 8a47b447 Michael Hanselmann
                                        "plain", [], [], dry_run=True)
272 8a47b447 Michael Hanselmann
    self.assertEqual(job_id, 23030)
273 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
274 95ab4de9 David Knowles
    self.assertDryRun()
275 95ab4de9 David Knowles
276 8a47b447 Michael Hanselmann
    data = serializer.LoadJson(self.http.last_request.data)
277 8a47b447 Michael Hanselmann
278 8a47b447 Michael Hanselmann
    for field in ["dry_run", "beparams", "hvparams", "start"]:
279 8a47b447 Michael Hanselmann
      self.assertFalse(field in data)
280 8a47b447 Michael Hanselmann
281 8a47b447 Michael Hanselmann
    self.assertEqual(data["name"], "inst1.example.com")
282 8a47b447 Michael Hanselmann
    self.assertEqual(data["disk_template"], "plain")
283 8a47b447 Michael Hanselmann
284 8a47b447 Michael Hanselmann
  def testCreateInstance2(self):
285 8a47b447 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_CREATE_REQV1]))
286 8a47b447 Michael Hanselmann
    self.rapi.AddResponse("24740")
287 8a47b447 Michael Hanselmann
    job_id = self.client.CreateInstance("import", "inst2.example.com",
288 8a47b447 Michael Hanselmann
                                        "drbd8", [{"size": 100,}],
289 8a47b447 Michael Hanselmann
                                        [{}, {"bridge": "br1", }],
290 8a47b447 Michael Hanselmann
                                        dry_run=False, start=True,
291 8a47b447 Michael Hanselmann
                                        pnode="node1", snode="node9",
292 8a47b447 Michael Hanselmann
                                        ip_check=False)
293 8a47b447 Michael Hanselmann
    self.assertEqual(job_id, 24740)
294 8a47b447 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances)
295 8a47b447 Michael Hanselmann
296 8a47b447 Michael Hanselmann
    data = serializer.LoadJson(self.http.last_request.data)
297 8a47b447 Michael Hanselmann
    self.assertEqual(data[rlib2._REQ_DATA_VERSION], 1)
298 8a47b447 Michael Hanselmann
    self.assertEqual(data["name"], "inst2.example.com")
299 8a47b447 Michael Hanselmann
    self.assertEqual(data["disk_template"], "drbd8")
300 8a47b447 Michael Hanselmann
    self.assertEqual(data["start"], True)
301 8a47b447 Michael Hanselmann
    self.assertEqual(data["ip_check"], False)
302 8a47b447 Michael Hanselmann
    self.assertEqualValues(data["disks"], [{"size": 100,}])
303 8a47b447 Michael Hanselmann
    self.assertEqualValues(data["nics"], [{}, {"bridge": "br1", }])
304 8a47b447 Michael Hanselmann
305 95ab4de9 David Knowles
  def testDeleteInstance(self):
306 cab667cc David Knowles
    self.rapi.AddResponse("1234")
307 cab667cc David Knowles
    self.assertEqual(1234, self.client.DeleteInstance("instance", dry_run=True))
308 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
309 95ab4de9 David Knowles
    self.assertItems(["instance"])
310 95ab4de9 David Knowles
    self.assertDryRun()
311 95ab4de9 David Knowles
312 95ab4de9 David Knowles
  def testGetInstanceTags(self):
313 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
314 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstanceTags("fooinstance"))
315 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
316 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
317 95ab4de9 David Knowles
318 95ab4de9 David Knowles
  def testAddInstanceTags(self):
319 cab667cc David Knowles
    self.rapi.AddResponse("1234")
320 cab667cc David Knowles
    self.assertEqual(1234,
321 cab667cc David Knowles
        self.client.AddInstanceTags("fooinstance", ["awesome"], dry_run=True))
322 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
323 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
324 95ab4de9 David Knowles
    self.assertDryRun()
325 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
326 95ab4de9 David Knowles
327 95ab4de9 David Knowles
  def testDeleteInstanceTags(self):
328 cd577680 Michael Hanselmann
    self.rapi.AddResponse("25826")
329 cd577680 Michael Hanselmann
    self.assertEqual(25826, self.client.DeleteInstanceTags("foo", ["awesome"],
330 cd577680 Michael Hanselmann
                                                           dry_run=True))
331 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
332 95ab4de9 David Knowles
    self.assertItems(["foo"])
333 95ab4de9 David Knowles
    self.assertDryRun()
334 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
335 95ab4de9 David Knowles
336 95ab4de9 David Knowles
  def testRebootInstance(self):
337 cd577680 Michael Hanselmann
    self.rapi.AddResponse("6146")
338 cd577680 Michael Hanselmann
    job_id = self.client.RebootInstance("i-bar", reboot_type="hard",
339 cd577680 Michael Hanselmann
                                        ignore_secondaries=True, dry_run=True)
340 cd577680 Michael Hanselmann
    self.assertEqual(6146, job_id)
341 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reboot)
342 95ab4de9 David Knowles
    self.assertItems(["i-bar"])
343 95ab4de9 David Knowles
    self.assertDryRun()
344 95ab4de9 David Knowles
    self.assertQuery("type", ["hard"])
345 10f5ab6c Michael Hanselmann
    self.assertQuery("ignore_secondaries", ["1"])
346 95ab4de9 David Knowles
347 95ab4de9 David Knowles
  def testShutdownInstance(self):
348 cd577680 Michael Hanselmann
    self.rapi.AddResponse("1487")
349 cd577680 Michael Hanselmann
    self.assertEqual(1487, self.client.ShutdownInstance("foo-instance",
350 cd577680 Michael Hanselmann
                                                        dry_run=True))
351 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_shutdown)
352 95ab4de9 David Knowles
    self.assertItems(["foo-instance"])
353 95ab4de9 David Knowles
    self.assertDryRun()
354 95ab4de9 David Knowles
355 95ab4de9 David Knowles
  def testStartupInstance(self):
356 cd577680 Michael Hanselmann
    self.rapi.AddResponse("27149")
357 cd577680 Michael Hanselmann
    self.assertEqual(27149, self.client.StartupInstance("bar-instance",
358 cd577680 Michael Hanselmann
                                                        dry_run=True))
359 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_startup)
360 95ab4de9 David Knowles
    self.assertItems(["bar-instance"])
361 95ab4de9 David Knowles
    self.assertDryRun()
362 95ab4de9 David Knowles
363 95ab4de9 David Knowles
  def testReinstallInstance(self):
364 cd577680 Michael Hanselmann
    self.rapi.AddResponse("19119")
365 cd577680 Michael Hanselmann
    self.assertEqual(19119, self.client.ReinstallInstance("baz-instance", "DOS",
366 cd577680 Michael Hanselmann
                                                          no_startup=True))
367 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
368 95ab4de9 David Knowles
    self.assertItems(["baz-instance"])
369 95ab4de9 David Knowles
    self.assertQuery("os", ["DOS"])
370 95ab4de9 David Knowles
    self.assertQuery("nostartup", ["1"])
371 95ab4de9 David Knowles
372 95ab4de9 David Knowles
  def testReplaceInstanceDisks(self):
373 95ab4de9 David Knowles
    self.rapi.AddResponse("999")
374 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-name",
375 bfc2002f Michael Hanselmann
        disks=[0, 1], dry_run=True, iallocator="hail")
376 95ab4de9 David Knowles
    self.assertEqual(999, job_id)
377 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_replace_disks)
378 95ab4de9 David Knowles
    self.assertItems(["instance-name"])
379 bfc2002f Michael Hanselmann
    self.assertQuery("disks", ["0,1"])
380 95ab4de9 David Knowles
    self.assertQuery("mode", ["replace_auto"])
381 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
382 95ab4de9 David Knowles
    self.assertDryRun()
383 95ab4de9 David Knowles
384 95ab4de9 David Knowles
    self.rapi.AddResponse("1000")
385 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-bar",
386 bfc2002f Michael Hanselmann
        disks=[1], mode="replace_on_secondary", remote_node="foo-node",
387 95ab4de9 David Knowles
        dry_run=True)
388 95ab4de9 David Knowles
    self.assertEqual(1000, job_id)
389 95ab4de9 David Knowles
    self.assertItems(["instance-bar"])
390 bfc2002f Michael Hanselmann
    self.assertQuery("disks", ["1"])
391 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["foo-node"])
392 95ab4de9 David Knowles
    self.assertDryRun()
393 95ab4de9 David Knowles
394 bfc2002f Michael Hanselmann
    self.rapi.AddResponse("5175")
395 bfc2002f Michael Hanselmann
    self.assertEqual(5175, self.client.ReplaceInstanceDisks("instance-moo"))
396 bfc2002f Michael Hanselmann
    self.assertItems(["instance-moo"])
397 bfc2002f Michael Hanselmann
    self.assertQuery("disks", None)
398 bfc2002f Michael Hanselmann
399 ebeb600f Michael Hanselmann
  def testPrepareExport(self):
400 ebeb600f Michael Hanselmann
    self.rapi.AddResponse("8326")
401 ebeb600f Michael Hanselmann
    self.assertEqual(8326, self.client.PrepareExport("inst1", "local"))
402 ebeb600f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_prepare_export)
403 ebeb600f Michael Hanselmann
    self.assertItems(["inst1"])
404 ebeb600f Michael Hanselmann
    self.assertQuery("mode", ["local"])
405 ebeb600f Michael Hanselmann
406 ebeb600f Michael Hanselmann
  def testExportInstance(self):
407 ebeb600f Michael Hanselmann
    self.rapi.AddResponse("19695")
408 ebeb600f Michael Hanselmann
    job_id = self.client.ExportInstance("inst2", "local", "nodeX",
409 ebeb600f Michael Hanselmann
                                        shutdown=True)
410 ebeb600f Michael Hanselmann
    self.assertEqual(job_id, 19695)
411 ebeb600f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_export)
412 ebeb600f Michael Hanselmann
    self.assertItems(["inst2"])
413 ebeb600f Michael Hanselmann
414 ebeb600f Michael Hanselmann
    data = serializer.LoadJson(self.http.last_request.data)
415 ebeb600f Michael Hanselmann
    self.assertEqual(data["mode"], "local")
416 ebeb600f Michael Hanselmann
    self.assertEqual(data["destination"], "nodeX")
417 ebeb600f Michael Hanselmann
    self.assertEqual(data["shutdown"], True)
418 ebeb600f Michael Hanselmann
419 95ab4de9 David Knowles
  def testGetJobs(self):
420 2004e673 Iustin Pop
    self.rapi.AddResponse('[ { "id": "123", "uri": "\\/2\\/jobs\\/123" },'
421 2004e673 Iustin Pop
                          '  { "id": "124", "uri": "\\/2\\/jobs\\/124" } ]')
422 95ab4de9 David Knowles
    self.assertEqual([123, 124], self.client.GetJobs())
423 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs)
424 95ab4de9 David Knowles
425 95ab4de9 David Knowles
  def testGetJobStatus(self):
426 95ab4de9 David Knowles
    self.rapi.AddResponse("{\"foo\": \"bar\"}")
427 95ab4de9 David Knowles
    self.assertEqual({"foo": "bar"}, self.client.GetJobStatus(1234))
428 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
429 95ab4de9 David Knowles
    self.assertItems(["1234"])
430 95ab4de9 David Knowles
431 d9b67f70 Michael Hanselmann
  def testWaitForJobChange(self):
432 d9b67f70 Michael Hanselmann
    fields = ["id", "summary"]
433 d9b67f70 Michael Hanselmann
    expected = {
434 d9b67f70 Michael Hanselmann
      "job_info": [123, "something"],
435 d9b67f70 Michael Hanselmann
      "log_entries": [],
436 d9b67f70 Michael Hanselmann
      }
437 d9b67f70 Michael Hanselmann
438 d9b67f70 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson(expected))
439 d9b67f70 Michael Hanselmann
    result = self.client.WaitForJobChange(123, fields, [], -1)
440 d9b67f70 Michael Hanselmann
    self.assertEqualValues(expected, result)
441 d9b67f70 Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id_wait)
442 d9b67f70 Michael Hanselmann
    self.assertItems(["123"])
443 d9b67f70 Michael Hanselmann
444 cf9ada49 Michael Hanselmann
  def testCancelJob(self):
445 cd577680 Michael Hanselmann
    self.rapi.AddResponse("[true, \"Job 123 will be canceled\"]")
446 cd577680 Michael Hanselmann
    self.assertEqual([True, "Job 123 will be canceled"],
447 cf9ada49 Michael Hanselmann
                     self.client.CancelJob(999, dry_run=True))
448 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
449 95ab4de9 David Knowles
    self.assertItems(["999"])
450 95ab4de9 David Knowles
    self.assertDryRun()
451 95ab4de9 David Knowles
452 95ab4de9 David Knowles
  def testGetNodes(self):
453 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
454 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
455 95ab4de9 David Knowles
    self.assertEqual(["node1", "node2"], self.client.GetNodes())
456 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
457 95ab4de9 David Knowles
458 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
459 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
460 95ab4de9 David Knowles
    self.assertEqual([{"id": "node1", "uri": "uri1"},
461 95ab4de9 David Knowles
                      {"id": "node2", "uri": "uri2"}],
462 95ab4de9 David Knowles
                     self.client.GetNodes(bulk=True))
463 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
464 95ab4de9 David Knowles
    self.assertBulk()
465 95ab4de9 David Knowles
466 591e5103 Michael Hanselmann
  def testGetNode(self):
467 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
468 591e5103 Michael Hanselmann
    self.assertEqual({}, self.client.GetNode("node-foo"))
469 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name)
470 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
471 95ab4de9 David Knowles
472 95ab4de9 David Knowles
  def testEvacuateNode(self):
473 95ab4de9 David Knowles
    self.rapi.AddResponse("9876")
474 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-1", remote_node="node-2")
475 95ab4de9 David Knowles
    self.assertEqual(9876, job_id)
476 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_evacuate)
477 95ab4de9 David Knowles
    self.assertItems(["node-1"])
478 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["node-2"])
479 95ab4de9 David Knowles
480 95ab4de9 David Knowles
    self.rapi.AddResponse("8888")
481 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-3", iallocator="hail", dry_run=True)
482 95ab4de9 David Knowles
    self.assertEqual(8888, job_id)
483 95ab4de9 David Knowles
    self.assertItems(["node-3"])
484 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
485 95ab4de9 David Knowles
    self.assertDryRun()
486 95ab4de9 David Knowles
487 95ab4de9 David Knowles
    self.assertRaises(client.GanetiApiError,
488 95ab4de9 David Knowles
                      self.client.EvacuateNode,
489 95ab4de9 David Knowles
                      "node-4", iallocator="hail", remote_node="node-5")
490 95ab4de9 David Knowles
491 95ab4de9 David Knowles
  def testMigrateNode(self):
492 95ab4de9 David Knowles
    self.rapi.AddResponse("1111")
493 95ab4de9 David Knowles
    self.assertEqual(1111, self.client.MigrateNode("node-a", dry_run=True))
494 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
495 95ab4de9 David Knowles
    self.assertItems(["node-a"])
496 95ab4de9 David Knowles
    self.assertQuery("live", ["1"])
497 95ab4de9 David Knowles
    self.assertDryRun()
498 95ab4de9 David Knowles
499 95ab4de9 David Knowles
  def testGetNodeRole(self):
500 95ab4de9 David Knowles
    self.rapi.AddResponse("\"master\"")
501 95ab4de9 David Knowles
    self.assertEqual("master", self.client.GetNodeRole("node-a"))
502 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
503 95ab4de9 David Knowles
    self.assertItems(["node-a"])
504 95ab4de9 David Knowles
505 95ab4de9 David Knowles
  def testSetNodeRole(self):
506 95ab4de9 David Knowles
    self.rapi.AddResponse("789")
507 95ab4de9 David Knowles
    self.assertEqual(789,
508 95ab4de9 David Knowles
        self.client.SetNodeRole("node-foo", "master-candidate", force=True))
509 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
510 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
511 10f5ab6c Michael Hanselmann
    self.assertQuery("force", ["1"])
512 9279e986 Michael Hanselmann
    self.assertEqual("\"master-candidate\"", self.http.last_request.data)
513 95ab4de9 David Knowles
514 95ab4de9 David Knowles
  def testGetNodeStorageUnits(self):
515 95ab4de9 David Knowles
    self.rapi.AddResponse("42")
516 95ab4de9 David Knowles
    self.assertEqual(42,
517 95ab4de9 David Knowles
        self.client.GetNodeStorageUnits("node-x", "lvm-pv", "fields"))
518 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage)
519 95ab4de9 David Knowles
    self.assertItems(["node-x"])
520 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
521 95ab4de9 David Knowles
    self.assertQuery("output_fields", ["fields"])
522 95ab4de9 David Knowles
523 95ab4de9 David Knowles
  def testModifyNodeStorageUnits(self):
524 95ab4de9 David Knowles
    self.rapi.AddResponse("14")
525 95ab4de9 David Knowles
    self.assertEqual(14,
526 95ab4de9 David Knowles
        self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda"))
527 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
528 95ab4de9 David Knowles
    self.assertItems(["node-z"])
529 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
530 95ab4de9 David Knowles
    self.assertQuery("name", ["hda"])
531 fde28316 Michael Hanselmann
    self.assertQuery("allocatable", None)
532 fde28316 Michael Hanselmann
533 fde28316 Michael Hanselmann
    for allocatable, query_allocatable in [(True, "1"), (False, "0")]:
534 fde28316 Michael Hanselmann
      self.rapi.AddResponse("7205")
535 fde28316 Michael Hanselmann
      job_id = self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda",
536 fde28316 Michael Hanselmann
                                                  allocatable=allocatable)
537 fde28316 Michael Hanselmann
      self.assertEqual(7205, job_id)
538 fde28316 Michael Hanselmann
      self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
539 fde28316 Michael Hanselmann
      self.assertItems(["node-z"])
540 fde28316 Michael Hanselmann
      self.assertQuery("storage_type", ["lvm-pv"])
541 fde28316 Michael Hanselmann
      self.assertQuery("name", ["hda"])
542 fde28316 Michael Hanselmann
      self.assertQuery("allocatable", [query_allocatable])
543 95ab4de9 David Knowles
544 752df8bb Michael Hanselmann
  def testRepairNodeStorageUnits(self):
545 752df8bb Michael Hanselmann
    self.rapi.AddResponse("99")
546 752df8bb Michael Hanselmann
    self.assertEqual(99, self.client.RepairNodeStorageUnits("node-z", "lvm-pv",
547 752df8bb Michael Hanselmann
                                                            "hda"))
548 752df8bb Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_storage_repair)
549 752df8bb Michael Hanselmann
    self.assertItems(["node-z"])
550 752df8bb Michael Hanselmann
    self.assertQuery("storage_type", ["lvm-pv"])
551 752df8bb Michael Hanselmann
    self.assertQuery("name", ["hda"])
552 752df8bb Michael Hanselmann
553 95ab4de9 David Knowles
  def testGetNodeTags(self):
554 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"fry\", \"bender\"]")
555 95ab4de9 David Knowles
    self.assertEqual(["fry", "bender"], self.client.GetNodeTags("node-k"))
556 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
557 95ab4de9 David Knowles
    self.assertItems(["node-k"])
558 95ab4de9 David Knowles
559 95ab4de9 David Knowles
  def testAddNodeTags(self):
560 cab667cc David Knowles
    self.rapi.AddResponse("1234")
561 cab667cc David Knowles
    self.assertEqual(1234,
562 cab667cc David Knowles
        self.client.AddNodeTags("node-v", ["awesome"], dry_run=True))
563 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
564 95ab4de9 David Knowles
    self.assertItems(["node-v"])
565 95ab4de9 David Knowles
    self.assertDryRun()
566 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
567 95ab4de9 David Knowles
568 95ab4de9 David Knowles
  def testDeleteNodeTags(self):
569 cd577680 Michael Hanselmann
    self.rapi.AddResponse("16861")
570 cd577680 Michael Hanselmann
    self.assertEqual(16861, self.client.DeleteNodeTags("node-w", ["awesome"],
571 cd577680 Michael Hanselmann
                                                       dry_run=True))
572 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
573 95ab4de9 David Knowles
    self.assertItems(["node-w"])
574 95ab4de9 David Knowles
    self.assertDryRun()
575 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
576 95ab4de9 David Knowles
577 95ab4de9 David Knowles
578 95ab4de9 David Knowles
if __name__ == '__main__':
579 9279e986 Michael Hanselmann
  testutils.GanetiTestProgram()