Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.rapi.client_unittest.py @ 91c17910

History | View | Annotate | Download (55.8 kB)

1 95ab4de9 David Knowles
#!/usr/bin/python
2 95ab4de9 David Knowles
#
3 95ab4de9 David Knowles
4 2e5c33db Iustin Pop
# Copyright (C) 2010, 2011 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 unittest
26 95ab4de9 David Knowles
import warnings
27 2a7c3583 Michael Hanselmann
import pycurl
28 95ab4de9 David Knowles
29 915faf72 René Nussbaumer
from ganeti import opcodes
30 2a7c3583 Michael Hanselmann
from ganeti import constants
31 95ab4de9 David Knowles
from ganeti import http
32 d9b67f70 Michael Hanselmann
from ganeti import serializer
33 70b0d2a2 Michael Hanselmann
from ganeti import utils
34 208a6cff Michael Hanselmann
from ganeti import query
35 208a6cff Michael Hanselmann
from ganeti import objects
36 f90a1ab5 René Nussbaumer
from ganeti import rapi
37 bc826292 Michael Hanselmann
from ganeti import errors
38 95ab4de9 David Knowles
39 f90a1ab5 René Nussbaumer
import ganeti.rapi.testutils
40 95ab4de9 David Knowles
from ganeti.rapi import connector
41 95ab4de9 David Knowles
from ganeti.rapi import rlib2
42 9279e986 Michael Hanselmann
from ganeti.rapi import client
43 95ab4de9 David Knowles
44 95ab4de9 David Knowles
import testutils
45 95ab4de9 David Knowles
46 95ab4de9 David Knowles
47 70b0d2a2 Michael Hanselmann
# List of resource handlers which aren't used by the RAPI client
48 70b0d2a2 Michael Hanselmann
_KNOWN_UNUSED = set([
49 0f945c65 Michael Hanselmann
  rlib2.R_root,
50 04b2332b Michael Hanselmann
  rlib2.R_2,
51 70b0d2a2 Michael Hanselmann
  ])
52 70b0d2a2 Michael Hanselmann
53 70b0d2a2 Michael Hanselmann
# Global variable for collecting used handlers
54 70b0d2a2 Michael Hanselmann
_used_handlers = None
55 70b0d2a2 Michael Hanselmann
56 95ab4de9 David Knowles
57 95ab4de9 David Knowles
class RapiMock(object):
58 95ab4de9 David Knowles
  def __init__(self):
59 95ab4de9 David Knowles
    self._mapper = connector.Mapper()
60 95ab4de9 David Knowles
    self._responses = []
61 95ab4de9 David Knowles
    self._last_handler = None
62 2a7c3583 Michael Hanselmann
    self._last_req_data = None
63 95ab4de9 David Knowles
64 dde0e97c Michael Hanselmann
  def ResetResponses(self):
65 dde0e97c Michael Hanselmann
    del self._responses[:]
66 dde0e97c Michael Hanselmann
67 de4f53e6 Michael Hanselmann
  def AddResponse(self, response, code=200):
68 de4f53e6 Michael Hanselmann
    self._responses.insert(0, (code, response))
69 95ab4de9 David Knowles
70 48436b97 Michael Hanselmann
  def CountPending(self):
71 48436b97 Michael Hanselmann
    return len(self._responses)
72 48436b97 Michael Hanselmann
73 95ab4de9 David Knowles
  def GetLastHandler(self):
74 95ab4de9 David Knowles
    return self._last_handler
75 95ab4de9 David Knowles
76 2a7c3583 Michael Hanselmann
  def GetLastRequestData(self):
77 2a7c3583 Michael Hanselmann
    return self._last_req_data
78 2a7c3583 Michael Hanselmann
79 d9492490 Michael Hanselmann
  def FetchResponse(self, path, method, headers, request_body):
80 2a7c3583 Michael Hanselmann
    self._last_req_data = request_body
81 2a7c3583 Michael Hanselmann
82 95ab4de9 David Knowles
    try:
83 70b0d2a2 Michael Hanselmann
      (handler_cls, items, args) = self._mapper.getController(path)
84 70b0d2a2 Michael Hanselmann
85 70b0d2a2 Michael Hanselmann
      # Record handler as used
86 70b0d2a2 Michael Hanselmann
      _used_handlers.add(handler_cls)
87 70b0d2a2 Michael Hanselmann
88 70b0d2a2 Michael Hanselmann
      self._last_handler = handler_cls(items, args, None)
89 95ab4de9 David Knowles
      if not hasattr(self._last_handler, method.upper()):
90 de4f53e6 Michael Hanselmann
        raise http.HttpNotImplemented(message="Method not implemented")
91 de4f53e6 Michael Hanselmann
92 95ab4de9 David Knowles
    except http.HttpException, ex:
93 95ab4de9 David Knowles
      code = ex.code
94 95ab4de9 David Knowles
      response = ex.message
95 de4f53e6 Michael Hanselmann
    else:
96 de4f53e6 Michael Hanselmann
      if not self._responses:
97 de4f53e6 Michael Hanselmann
        raise Exception("No responses")
98 95ab4de9 David Knowles
99 de4f53e6 Michael Hanselmann
      (code, response) = self._responses.pop()
100 95ab4de9 David Knowles
101 0351944b Michael Hanselmann
    return (code, NotImplemented, response)
102 95ab4de9 David Knowles
103 95ab4de9 David Knowles
104 2a7c3583 Michael Hanselmann
class TestConstants(unittest.TestCase):
105 2a7c3583 Michael Hanselmann
  def test(self):
106 2a7c3583 Michael Hanselmann
    self.assertEqual(client.GANETI_RAPI_PORT, constants.DEFAULT_RAPI_PORT)
107 2a7c3583 Michael Hanselmann
    self.assertEqual(client.GANETI_RAPI_VERSION, constants.RAPI_VERSION)
108 2a7c3583 Michael Hanselmann
    self.assertEqual(client.HTTP_APP_JSON, http.HTTP_APP_JSON)
109 2a7c3583 Michael Hanselmann
    self.assertEqual(client._REQ_DATA_VERSION_FIELD, rlib2._REQ_DATA_VERSION)
110 63d5eb8a Michael Hanselmann
    self.assertEqual(client.JOB_STATUS_QUEUED, constants.JOB_STATUS_QUEUED)
111 47099cd1 Michael Hanselmann
    self.assertEqual(client.JOB_STATUS_WAITING, constants.JOB_STATUS_WAITING)
112 63d5eb8a Michael Hanselmann
    self.assertEqual(client.JOB_STATUS_CANCELING,
113 63d5eb8a Michael Hanselmann
                     constants.JOB_STATUS_CANCELING)
114 63d5eb8a Michael Hanselmann
    self.assertEqual(client.JOB_STATUS_RUNNING, constants.JOB_STATUS_RUNNING)
115 63d5eb8a Michael Hanselmann
    self.assertEqual(client.JOB_STATUS_CANCELED, constants.JOB_STATUS_CANCELED)
116 63d5eb8a Michael Hanselmann
    self.assertEqual(client.JOB_STATUS_SUCCESS, constants.JOB_STATUS_SUCCESS)
117 63d5eb8a Michael Hanselmann
    self.assertEqual(client.JOB_STATUS_ERROR, constants.JOB_STATUS_ERROR)
118 1eaddbc6 Michael Hanselmann
    self.assertEqual(client.JOB_STATUS_PENDING, constants.JOBS_PENDING)
119 63d5eb8a Michael Hanselmann
    self.assertEqual(client.JOB_STATUS_FINALIZED, constants.JOBS_FINALIZED)
120 63d5eb8a Michael Hanselmann
    self.assertEqual(client.JOB_STATUS_ALL, constants.JOB_STATUS_ALL)
121 2a7c3583 Michael Hanselmann
122 0b58db81 Michael Hanselmann
    # Node evacuation
123 cb92e7a1 Michael Hanselmann
    self.assertEqual(client.NODE_EVAC_PRI, constants.NODE_EVAC_PRI)
124 cb92e7a1 Michael Hanselmann
    self.assertEqual(client.NODE_EVAC_SEC, constants.NODE_EVAC_SEC)
125 cb92e7a1 Michael Hanselmann
    self.assertEqual(client.NODE_EVAC_ALL, constants.NODE_EVAC_ALL)
126 0b58db81 Michael Hanselmann
127 47099cd1 Michael Hanselmann
    # Legacy name
128 47099cd1 Michael Hanselmann
    self.assertEqual(client.JOB_STATUS_WAITLOCK, constants.JOB_STATUS_WAITING)
129 47099cd1 Michael Hanselmann
130 6396dc04 Michael Hanselmann
    # RAPI feature strings
131 6396dc04 Michael Hanselmann
    self.assertEqual(client._INST_CREATE_REQV1, rlib2._INST_CREATE_REQV1)
132 6396dc04 Michael Hanselmann
    self.assertEqual(client.INST_CREATE_REQV1, rlib2._INST_CREATE_REQV1)
133 6396dc04 Michael Hanselmann
    self.assertEqual(client._INST_REINSTALL_REQV1, rlib2._INST_REINSTALL_REQV1)
134 6396dc04 Michael Hanselmann
    self.assertEqual(client.INST_REINSTALL_REQV1, rlib2._INST_REINSTALL_REQV1)
135 6396dc04 Michael Hanselmann
    self.assertEqual(client._NODE_MIGRATE_REQV1, rlib2._NODE_MIGRATE_REQV1)
136 6396dc04 Michael Hanselmann
    self.assertEqual(client.NODE_MIGRATE_REQV1, rlib2._NODE_MIGRATE_REQV1)
137 6396dc04 Michael Hanselmann
    self.assertEqual(client._NODE_EVAC_RES1, rlib2._NODE_EVAC_RES1)
138 6396dc04 Michael Hanselmann
    self.assertEqual(client.NODE_EVAC_RES1, rlib2._NODE_EVAC_RES1)
139 6396dc04 Michael Hanselmann
140 bc826292 Michael Hanselmann
  def testErrors(self):
141 bc826292 Michael Hanselmann
    self.assertEqual(client.ECODE_ALL, errors.ECODE_ALL)
142 bc826292 Michael Hanselmann
143 bc826292 Michael Hanselmann
    # Make sure all error codes are in both RAPI client and errors module
144 bc826292 Michael Hanselmann
    for name in filter(lambda s: (s.startswith("ECODE_") and s != "ECODE_ALL"),
145 bc826292 Michael Hanselmann
                       dir(client)):
146 bc826292 Michael Hanselmann
      value = getattr(client, name)
147 bc826292 Michael Hanselmann
      self.assertEqual(value, getattr(errors, name))
148 bc826292 Michael Hanselmann
      self.assertTrue(value in client.ECODE_ALL)
149 bc826292 Michael Hanselmann
      self.assertTrue(value in errors.ECODE_ALL)
150 bc826292 Michael Hanselmann
151 2a7c3583 Michael Hanselmann
152 95ab4de9 David Knowles
class RapiMockTest(unittest.TestCase):
153 0351944b Michael Hanselmann
  def test404(self):
154 0351944b Michael Hanselmann
    (code, _, body) = RapiMock().FetchResponse("/foo", "GET", None, None)
155 0351944b Michael Hanselmann
    self.assertEqual(code, 404)
156 0351944b Michael Hanselmann
    self.assertTrue(body is None)
157 0351944b Michael Hanselmann
158 0351944b Michael Hanselmann
  def test501(self):
159 0351944b Michael Hanselmann
    (code, _, body) = RapiMock().FetchResponse("/version", "POST", None, None)
160 0351944b Michael Hanselmann
    self.assertEqual(code, 501)
161 0351944b Michael Hanselmann
    self.assertEqual(body, "Method not implemented")
162 0351944b Michael Hanselmann
163 0351944b Michael Hanselmann
  def test200(self):
164 95ab4de9 David Knowles
    rapi = RapiMock()
165 95ab4de9 David Knowles
    rapi.AddResponse("2")
166 0351944b Michael Hanselmann
    (code, _, response) = rapi.FetchResponse("/version", "GET", None, None)
167 95ab4de9 David Knowles
    self.assertEqual(200, code)
168 95ab4de9 David Knowles
    self.assertEqual("2", response)
169 95ab4de9 David Knowles
    self.failUnless(isinstance(rapi.GetLastHandler(), rlib2.R_version))
170 95ab4de9 David Knowles
171 95ab4de9 David Knowles
172 2a7c3583 Michael Hanselmann
def _FakeNoSslPycurlVersion():
173 2a7c3583 Michael Hanselmann
  # Note: incomplete version tuple
174 2a7c3583 Michael Hanselmann
  return (3, "7.16.0", 462848, "mysystem", 1581, None, 0)
175 2a7c3583 Michael Hanselmann
176 2a7c3583 Michael Hanselmann
177 2a7c3583 Michael Hanselmann
def _FakeFancySslPycurlVersion():
178 2a7c3583 Michael Hanselmann
  # Note: incomplete version tuple
179 2a7c3583 Michael Hanselmann
  return (3, "7.16.0", 462848, "mysystem", 1581, "FancySSL/1.2.3", 0)
180 2a7c3583 Michael Hanselmann
181 2a7c3583 Michael Hanselmann
182 2a7c3583 Michael Hanselmann
def _FakeOpenSslPycurlVersion():
183 2a7c3583 Michael Hanselmann
  # Note: incomplete version tuple
184 2a7c3583 Michael Hanselmann
  return (2, "7.15.5", 462597, "othersystem", 668, "OpenSSL/0.9.8c", 0)
185 2a7c3583 Michael Hanselmann
186 2a7c3583 Michael Hanselmann
187 2a7c3583 Michael Hanselmann
def _FakeGnuTlsPycurlVersion():
188 2a7c3583 Michael Hanselmann
  # Note: incomplete version tuple
189 2a7c3583 Michael Hanselmann
  return (3, "7.18.0", 463360, "somesystem", 1581, "GnuTLS/2.0.4", 0)
190 2a7c3583 Michael Hanselmann
191 2a7c3583 Michael Hanselmann
192 2a7c3583 Michael Hanselmann
class TestExtendedConfig(unittest.TestCase):
193 2a7c3583 Michael Hanselmann
  def testAuth(self):
194 2a7c3583 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com",
195 f90a1ab5 René Nussbaumer
      username="user", password="pw",
196 f90a1ab5 René Nussbaumer
      curl_factory=lambda: rapi.testutils.FakeCurl(RapiMock()))
197 2a7c3583 Michael Hanselmann
198 a5eba783 Michael Hanselmann
    curl = cl._CreateCurl()
199 2a7c3583 Michael Hanselmann
    self.assertEqual(curl.getopt(pycurl.HTTPAUTH), pycurl.HTTPAUTH_BASIC)
200 2a7c3583 Michael Hanselmann
    self.assertEqual(curl.getopt(pycurl.USERPWD), "user:pw")
201 2a7c3583 Michael Hanselmann
202 2a7c3583 Michael Hanselmann
  def testInvalidAuth(self):
203 2a7c3583 Michael Hanselmann
    # No username
204 2a7c3583 Michael Hanselmann
    self.assertRaises(client.Error, client.GanetiRapiClient,
205 2a7c3583 Michael Hanselmann
                      "master-a.example.com", password="pw")
206 2a7c3583 Michael Hanselmann
    # No password
207 2a7c3583 Michael Hanselmann
    self.assertRaises(client.Error, client.GanetiRapiClient,
208 2a7c3583 Michael Hanselmann
                      "master-b.example.com", username="user")
209 2a7c3583 Michael Hanselmann
210 2a7c3583 Michael Hanselmann
  def testCertVerifyInvalidCombinations(self):
211 2a7c3583 Michael Hanselmann
    self.assertRaises(client.Error, client.GenericCurlConfig,
212 2a7c3583 Michael Hanselmann
                      use_curl_cabundle=True, cafile="cert1.pem")
213 2a7c3583 Michael Hanselmann
    self.assertRaises(client.Error, client.GenericCurlConfig,
214 2a7c3583 Michael Hanselmann
                      use_curl_cabundle=True, capath="certs/")
215 2a7c3583 Michael Hanselmann
    self.assertRaises(client.Error, client.GenericCurlConfig,
216 2a7c3583 Michael Hanselmann
                      use_curl_cabundle=True,
217 2a7c3583 Michael Hanselmann
                      cafile="cert1.pem", capath="certs/")
218 2a7c3583 Michael Hanselmann
219 2a7c3583 Michael Hanselmann
  def testProxySignalVerifyHostname(self):
220 2a7c3583 Michael Hanselmann
    for use_gnutls in [False, True]:
221 2a7c3583 Michael Hanselmann
      if use_gnutls:
222 2a7c3583 Michael Hanselmann
        pcverfn = _FakeGnuTlsPycurlVersion
223 2a7c3583 Michael Hanselmann
      else:
224 2a7c3583 Michael Hanselmann
        pcverfn = _FakeOpenSslPycurlVersion
225 2a7c3583 Michael Hanselmann
226 2a7c3583 Michael Hanselmann
      for proxy in ["", "http://127.0.0.1:1234"]:
227 2a7c3583 Michael Hanselmann
        for use_signal in [False, True]:
228 2a7c3583 Michael Hanselmann
          for verify_hostname in [False, True]:
229 2a7c3583 Michael Hanselmann
            cfgfn = client.GenericCurlConfig(proxy=proxy, use_signal=use_signal,
230 2a7c3583 Michael Hanselmann
                                             verify_hostname=verify_hostname,
231 2a7c3583 Michael Hanselmann
                                             _pycurl_version_fn=pcverfn)
232 2a7c3583 Michael Hanselmann
233 f90a1ab5 René Nussbaumer
            curl_factory = lambda: rapi.testutils.FakeCurl(RapiMock())
234 2a7c3583 Michael Hanselmann
            cl = client.GanetiRapiClient("master.example.com",
235 a5eba783 Michael Hanselmann
                                         curl_config_fn=cfgfn,
236 a5eba783 Michael Hanselmann
                                         curl_factory=curl_factory)
237 2a7c3583 Michael Hanselmann
238 a5eba783 Michael Hanselmann
            curl = cl._CreateCurl()
239 2a7c3583 Michael Hanselmann
            self.assertEqual(curl.getopt(pycurl.PROXY), proxy)
240 2a7c3583 Michael Hanselmann
            self.assertEqual(curl.getopt(pycurl.NOSIGNAL), not use_signal)
241 2a7c3583 Michael Hanselmann
242 2a7c3583 Michael Hanselmann
            if verify_hostname:
243 2a7c3583 Michael Hanselmann
              self.assertEqual(curl.getopt(pycurl.SSL_VERIFYHOST), 2)
244 2a7c3583 Michael Hanselmann
            else:
245 2a7c3583 Michael Hanselmann
              self.assertEqual(curl.getopt(pycurl.SSL_VERIFYHOST), 0)
246 2a7c3583 Michael Hanselmann
247 2a7c3583 Michael Hanselmann
  def testNoCertVerify(self):
248 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig()
249 2a7c3583 Michael Hanselmann
250 f90a1ab5 René Nussbaumer
    curl_factory = lambda: rapi.testutils.FakeCurl(RapiMock())
251 2a7c3583 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
252 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
253 2a7c3583 Michael Hanselmann
254 a5eba783 Michael Hanselmann
    curl = cl._CreateCurl()
255 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.SSL_VERIFYPEER))
256 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAINFO))
257 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAPATH))
258 2a7c3583 Michael Hanselmann
259 2a7c3583 Michael Hanselmann
  def testCertVerifyCurlBundle(self):
260 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(use_curl_cabundle=True)
261 2a7c3583 Michael Hanselmann
262 f90a1ab5 René Nussbaumer
    curl_factory = lambda: rapi.testutils.FakeCurl(RapiMock())
263 2a7c3583 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
264 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
265 2a7c3583 Michael Hanselmann
266 a5eba783 Michael Hanselmann
    curl = cl._CreateCurl()
267 2a7c3583 Michael Hanselmann
    self.assert_(curl.getopt(pycurl.SSL_VERIFYPEER))
268 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAINFO))
269 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAPATH))
270 2a7c3583 Michael Hanselmann
271 2a7c3583 Michael Hanselmann
  def testCertVerifyCafile(self):
272 2a7c3583 Michael Hanselmann
    mycert = "/tmp/some/UNUSED/cert/file.pem"
273 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(cafile=mycert)
274 2a7c3583 Michael Hanselmann
275 f90a1ab5 René Nussbaumer
    curl_factory = lambda: rapi.testutils.FakeCurl(RapiMock())
276 2a7c3583 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
277 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
278 2a7c3583 Michael Hanselmann
279 a5eba783 Michael Hanselmann
    curl = cl._CreateCurl()
280 2a7c3583 Michael Hanselmann
    self.assert_(curl.getopt(pycurl.SSL_VERIFYPEER))
281 2a7c3583 Michael Hanselmann
    self.assertEqual(curl.getopt(pycurl.CAINFO), mycert)
282 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAPATH))
283 2a7c3583 Michael Hanselmann
284 2a7c3583 Michael Hanselmann
  def testCertVerifyCapath(self):
285 2a7c3583 Michael Hanselmann
    certdir = "/tmp/some/UNUSED/cert/directory"
286 2a7c3583 Michael Hanselmann
    pcverfn = _FakeOpenSslPycurlVersion
287 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(capath=certdir,
288 2a7c3583 Michael Hanselmann
                                     _pycurl_version_fn=pcverfn)
289 2a7c3583 Michael Hanselmann
290 f90a1ab5 René Nussbaumer
    curl_factory = lambda: rapi.testutils.FakeCurl(RapiMock())
291 2a7c3583 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
292 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
293 2a7c3583 Michael Hanselmann
294 a5eba783 Michael Hanselmann
    curl = cl._CreateCurl()
295 2a7c3583 Michael Hanselmann
    self.assert_(curl.getopt(pycurl.SSL_VERIFYPEER))
296 2a7c3583 Michael Hanselmann
    self.assertEqual(curl.getopt(pycurl.CAPATH), certdir)
297 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAINFO))
298 2a7c3583 Michael Hanselmann
299 2a7c3583 Michael Hanselmann
  def testCertVerifyCapathGnuTls(self):
300 2a7c3583 Michael Hanselmann
    certdir = "/tmp/some/UNUSED/cert/directory"
301 2a7c3583 Michael Hanselmann
    pcverfn = _FakeGnuTlsPycurlVersion
302 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(capath=certdir,
303 2a7c3583 Michael Hanselmann
                                     _pycurl_version_fn=pcverfn)
304 2a7c3583 Michael Hanselmann
305 f90a1ab5 René Nussbaumer
    curl_factory = lambda: rapi.testutils.FakeCurl(RapiMock())
306 a5eba783 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
307 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
308 a5eba783 Michael Hanselmann
309 a5eba783 Michael Hanselmann
    self.assertRaises(client.Error, cl._CreateCurl)
310 2a7c3583 Michael Hanselmann
311 2a7c3583 Michael Hanselmann
  def testCertVerifyNoSsl(self):
312 2a7c3583 Michael Hanselmann
    certdir = "/tmp/some/UNUSED/cert/directory"
313 2a7c3583 Michael Hanselmann
    pcverfn = _FakeNoSslPycurlVersion
314 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(capath=certdir,
315 2a7c3583 Michael Hanselmann
                                     _pycurl_version_fn=pcverfn)
316 2a7c3583 Michael Hanselmann
317 f90a1ab5 René Nussbaumer
    curl_factory = lambda: rapi.testutils.FakeCurl(RapiMock())
318 a5eba783 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
319 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
320 a5eba783 Michael Hanselmann
321 a5eba783 Michael Hanselmann
    self.assertRaises(client.Error, cl._CreateCurl)
322 2a7c3583 Michael Hanselmann
323 2a7c3583 Michael Hanselmann
  def testCertVerifyFancySsl(self):
324 2a7c3583 Michael Hanselmann
    certdir = "/tmp/some/UNUSED/cert/directory"
325 2a7c3583 Michael Hanselmann
    pcverfn = _FakeFancySslPycurlVersion
326 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(capath=certdir,
327 2a7c3583 Michael Hanselmann
                                     _pycurl_version_fn=pcverfn)
328 2a7c3583 Michael Hanselmann
329 f90a1ab5 René Nussbaumer
    curl_factory = lambda: rapi.testutils.FakeCurl(RapiMock())
330 a5eba783 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
331 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
332 a5eba783 Michael Hanselmann
333 a5eba783 Michael Hanselmann
    self.assertRaises(NotImplementedError, cl._CreateCurl)
334 2a7c3583 Michael Hanselmann
335 2a7c3583 Michael Hanselmann
  def testCertVerifyCapath(self):
336 2a7c3583 Michael Hanselmann
    for connect_timeout in [None, 1, 5, 10, 30, 60, 300]:
337 2a7c3583 Michael Hanselmann
      for timeout in [None, 1, 30, 60, 3600, 24 * 3600]:
338 2a7c3583 Michael Hanselmann
        cfgfn = client.GenericCurlConfig(connect_timeout=connect_timeout,
339 2a7c3583 Michael Hanselmann
                                         timeout=timeout)
340 2a7c3583 Michael Hanselmann
341 f90a1ab5 René Nussbaumer
        curl_factory = lambda: rapi.testutils.FakeCurl(RapiMock())
342 2a7c3583 Michael Hanselmann
        cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
343 a5eba783 Michael Hanselmann
                                     curl_factory=curl_factory)
344 2a7c3583 Michael Hanselmann
345 a5eba783 Michael Hanselmann
        curl = cl._CreateCurl()
346 2a7c3583 Michael Hanselmann
        self.assertEqual(curl.getopt(pycurl.CONNECTTIMEOUT), connect_timeout)
347 2a7c3583 Michael Hanselmann
        self.assertEqual(curl.getopt(pycurl.TIMEOUT), timeout)
348 2a7c3583 Michael Hanselmann
349 2a7c3583 Michael Hanselmann
350 d9b67f70 Michael Hanselmann
class GanetiRapiClientTests(testutils.GanetiTestCase):
351 95ab4de9 David Knowles
  def setUp(self):
352 d9b67f70 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
353 d9b67f70 Michael Hanselmann
354 95ab4de9 David Knowles
    self.rapi = RapiMock()
355 f90a1ab5 René Nussbaumer
    self.curl = rapi.testutils.FakeCurl(self.rapi)
356 2a7c3583 Michael Hanselmann
    self.client = client.GanetiRapiClient("master.example.com",
357 a5eba783 Michael Hanselmann
                                          curl_factory=lambda: self.curl)
358 95ab4de9 David Knowles
359 95ab4de9 David Knowles
  def assertHandler(self, handler_cls):
360 95ab4de9 David Knowles
    self.failUnless(isinstance(self.rapi.GetLastHandler(), handler_cls))
361 95ab4de9 David Knowles
362 95ab4de9 David Knowles
  def assertQuery(self, key, value):
363 95ab4de9 David Knowles
    self.assertEqual(value, self.rapi.GetLastHandler().queryargs.get(key, None))
364 95ab4de9 David Knowles
365 95ab4de9 David Knowles
  def assertItems(self, items):
366 95ab4de9 David Knowles
    self.assertEqual(items, self.rapi.GetLastHandler().items)
367 95ab4de9 David Knowles
368 95ab4de9 David Knowles
  def assertBulk(self):
369 95ab4de9 David Knowles
    self.assertTrue(self.rapi.GetLastHandler().useBulk())
370 95ab4de9 David Knowles
371 95ab4de9 David Knowles
  def assertDryRun(self):
372 95ab4de9 David Knowles
    self.assertTrue(self.rapi.GetLastHandler().dryRun())
373 95ab4de9 David Knowles
374 4245446f Adeodato Simo
  def assertUseForce(self):
375 4245446f Adeodato Simo
    self.assertTrue(self.rapi.GetLastHandler().useForce())
376 4245446f Adeodato Simo
377 10f5ab6c Michael Hanselmann
  def testEncodeQuery(self):
378 10f5ab6c Michael Hanselmann
    query = [
379 10f5ab6c Michael Hanselmann
      ("a", None),
380 10f5ab6c Michael Hanselmann
      ("b", 1),
381 10f5ab6c Michael Hanselmann
      ("c", 2),
382 10f5ab6c Michael Hanselmann
      ("d", "Foo"),
383 10f5ab6c Michael Hanselmann
      ("e", True),
384 10f5ab6c Michael Hanselmann
      ]
385 10f5ab6c Michael Hanselmann
386 10f5ab6c Michael Hanselmann
    expected = [
387 10f5ab6c Michael Hanselmann
      ("a", ""),
388 10f5ab6c Michael Hanselmann
      ("b", 1),
389 10f5ab6c Michael Hanselmann
      ("c", 2),
390 10f5ab6c Michael Hanselmann
      ("d", "Foo"),
391 10f5ab6c Michael Hanselmann
      ("e", 1),
392 10f5ab6c Michael Hanselmann
      ]
393 10f5ab6c Michael Hanselmann
394 10f5ab6c Michael Hanselmann
    self.assertEqualValues(self.client._EncodeQuery(query),
395 10f5ab6c Michael Hanselmann
                           expected)
396 10f5ab6c Michael Hanselmann
397 10f5ab6c Michael Hanselmann
    # invalid types
398 10f5ab6c Michael Hanselmann
    for i in [[1, 2, 3], {"moo": "boo"}, (1, 2, 3)]:
399 10f5ab6c Michael Hanselmann
      self.assertRaises(ValueError, self.client._EncodeQuery, [("x", i)])
400 10f5ab6c Michael Hanselmann
401 a5eba783 Michael Hanselmann
  def testCurlSettings(self):
402 a5eba783 Michael Hanselmann
    self.rapi.AddResponse("2")
403 a5eba783 Michael Hanselmann
    self.assertEqual(2, self.client.GetVersion())
404 a5eba783 Michael Hanselmann
    self.assertHandler(rlib2.R_version)
405 a5eba783 Michael Hanselmann
406 a5eba783 Michael Hanselmann
    # Signals should be disabled by default
407 a5eba783 Michael Hanselmann
    self.assert_(self.curl.getopt(pycurl.NOSIGNAL))
408 a5eba783 Michael Hanselmann
409 a5eba783 Michael Hanselmann
    # No auth and no proxy
410 a5eba783 Michael Hanselmann
    self.assertFalse(self.curl.getopt(pycurl.USERPWD))
411 a5eba783 Michael Hanselmann
    self.assert_(self.curl.getopt(pycurl.PROXY) is None)
412 a5eba783 Michael Hanselmann
413 a5eba783 Michael Hanselmann
    # Content-type is required for requests
414 a5eba783 Michael Hanselmann
    headers = self.curl.getopt(pycurl.HTTPHEADER)
415 a5eba783 Michael Hanselmann
    self.assert_("Content-type: application/json" in headers)
416 a5eba783 Michael Hanselmann
417 8a019a03 Michael Hanselmann
  def testHttpError(self):
418 8a019a03 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
419 8a019a03 Michael Hanselmann
    try:
420 8a019a03 Michael Hanselmann
      self.client.GetJobStatus(15140)
421 8a019a03 Michael Hanselmann
    except client.GanetiApiError, err:
422 8a019a03 Michael Hanselmann
      self.assertEqual(err.code, 404)
423 8a019a03 Michael Hanselmann
    else:
424 8a019a03 Michael Hanselmann
      self.fail("Didn't raise exception")
425 8a019a03 Michael Hanselmann
426 95ab4de9 David Knowles
  def testGetVersion(self):
427 95ab4de9 David Knowles
    self.rapi.AddResponse("2")
428 95ab4de9 David Knowles
    self.assertEqual(2, self.client.GetVersion())
429 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_version)
430 95ab4de9 David Knowles
431 7eac4a4d Michael Hanselmann
  def testGetFeatures(self):
432 7eac4a4d Michael Hanselmann
    for features in [[], ["foo", "bar", "baz"]]:
433 7eac4a4d Michael Hanselmann
      self.rapi.AddResponse(serializer.DumpJson(features))
434 7eac4a4d Michael Hanselmann
      self.assertEqual(features, self.client.GetFeatures())
435 7eac4a4d Michael Hanselmann
      self.assertHandler(rlib2.R_2_features)
436 7eac4a4d Michael Hanselmann
437 48436b97 Michael Hanselmann
  def testGetFeaturesNotFound(self):
438 48436b97 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
439 48436b97 Michael Hanselmann
    self.assertEqual([], self.client.GetFeatures())
440 48436b97 Michael Hanselmann
441 95ab4de9 David Knowles
  def testGetOperatingSystems(self):
442 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"beos\"]")
443 95ab4de9 David Knowles
    self.assertEqual(["beos"], self.client.GetOperatingSystems())
444 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_os)
445 95ab4de9 David Knowles
446 95ab4de9 David Knowles
  def testGetClusterTags(self):
447 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"tag\"]")
448 95ab4de9 David Knowles
    self.assertEqual(["tag"], self.client.GetClusterTags())
449 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
450 95ab4de9 David Knowles
451 95ab4de9 David Knowles
  def testAddClusterTags(self):
452 cab667cc David Knowles
    self.rapi.AddResponse("1234")
453 cab667cc David Knowles
    self.assertEqual(1234,
454 cab667cc David Knowles
        self.client.AddClusterTags(["awesome"], dry_run=True))
455 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
456 95ab4de9 David Knowles
    self.assertDryRun()
457 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
458 95ab4de9 David Knowles
459 95ab4de9 David Knowles
  def testDeleteClusterTags(self):
460 cd577680 Michael Hanselmann
    self.rapi.AddResponse("5107")
461 cd577680 Michael Hanselmann
    self.assertEqual(5107, self.client.DeleteClusterTags(["awesome"],
462 cd577680 Michael Hanselmann
                                                         dry_run=True))
463 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
464 95ab4de9 David Knowles
    self.assertDryRun()
465 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
466 95ab4de9 David Knowles
467 95ab4de9 David Knowles
  def testGetInfo(self):
468 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
469 95ab4de9 David Knowles
    self.assertEqual({}, self.client.GetInfo())
470 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_info)
471 95ab4de9 David Knowles
472 95ab4de9 David Knowles
  def testGetInstances(self):
473 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
474 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstances(bulk=True))
475 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
476 95ab4de9 David Knowles
    self.assertBulk()
477 95ab4de9 David Knowles
478 591e5103 Michael Hanselmann
  def testGetInstance(self):
479 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
480 591e5103 Michael Hanselmann
    self.assertEqual([], self.client.GetInstance("instance"))
481 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
482 95ab4de9 David Knowles
    self.assertItems(["instance"])
483 95ab4de9 David Knowles
484 591e5103 Michael Hanselmann
  def testGetInstanceInfo(self):
485 591e5103 Michael Hanselmann
    self.rapi.AddResponse("21291")
486 591e5103 Michael Hanselmann
    self.assertEqual(21291, self.client.GetInstanceInfo("inst3"))
487 591e5103 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_info)
488 591e5103 Michael Hanselmann
    self.assertItems(["inst3"])
489 591e5103 Michael Hanselmann
    self.assertQuery("static", None)
490 591e5103 Michael Hanselmann
491 591e5103 Michael Hanselmann
    self.rapi.AddResponse("3428")
492 591e5103 Michael Hanselmann
    self.assertEqual(3428, self.client.GetInstanceInfo("inst31", static=False))
493 591e5103 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_info)
494 591e5103 Michael Hanselmann
    self.assertItems(["inst31"])
495 591e5103 Michael Hanselmann
    self.assertQuery("static", ["0"])
496 591e5103 Michael Hanselmann
497 591e5103 Michael Hanselmann
    self.rapi.AddResponse("15665")
498 591e5103 Michael Hanselmann
    self.assertEqual(15665, self.client.GetInstanceInfo("inst32", static=True))
499 591e5103 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_info)
500 591e5103 Michael Hanselmann
    self.assertItems(["inst32"])
501 591e5103 Michael Hanselmann
    self.assertQuery("static", ["1"])
502 591e5103 Michael Hanselmann
503 915faf72 René Nussbaumer
  def testInstancesMultiAlloc(self):
504 915faf72 René Nussbaumer
    response = {
505 915faf72 René Nussbaumer
      constants.JOB_IDS_KEY: ["23423"],
506 915faf72 René Nussbaumer
      opcodes.OpInstanceMultiAlloc.ALLOCATABLE_KEY: ["foobar"],
507 915faf72 René Nussbaumer
      opcodes.OpInstanceMultiAlloc.FAILED_KEY: ["foobar2"],
508 915faf72 René Nussbaumer
      }
509 915faf72 René Nussbaumer
    self.rapi.AddResponse(serializer.DumpJson(response))
510 915faf72 René Nussbaumer
    insts = [self.client.InstanceAllocation("create", "foobar",
511 915faf72 René Nussbaumer
                                            "plain", [], []),
512 915faf72 René Nussbaumer
             self.client.InstanceAllocation("create", "foobar2",
513 915faf72 René Nussbaumer
                                            "drbd8", [{"size": 100}], [])]
514 915faf72 René Nussbaumer
    resp = self.client.InstancesMultiAlloc(insts)
515 915faf72 René Nussbaumer
    self.assertEqual(resp, response)
516 915faf72 René Nussbaumer
    self.assertHandler(rlib2.R_2_instances_multi_alloc)
517 915faf72 René Nussbaumer
518 8a47b447 Michael Hanselmann
  def testCreateInstanceOldVersion(self):
519 9a8ae794 Michael Hanselmann
    # The old request format, version 0, is no longer supported
520 48436b97 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
521 48436b97 Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.CreateInstance,
522 48436b97 Michael Hanselmann
                      "create", "inst1.example.com", "plain", [], [])
523 48436b97 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
524 48436b97 Michael Hanselmann
525 95ab4de9 David Knowles
  def testCreateInstance(self):
526 8a47b447 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_CREATE_REQV1]))
527 8a47b447 Michael Hanselmann
    self.rapi.AddResponse("23030")
528 8a47b447 Michael Hanselmann
    job_id = self.client.CreateInstance("create", "inst1.example.com",
529 8a47b447 Michael Hanselmann
                                        "plain", [], [], dry_run=True)
530 8a47b447 Michael Hanselmann
    self.assertEqual(job_id, 23030)
531 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
532 95ab4de9 David Knowles
    self.assertDryRun()
533 95ab4de9 David Knowles
534 2a7c3583 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
535 8a47b447 Michael Hanselmann
536 8a47b447 Michael Hanselmann
    for field in ["dry_run", "beparams", "hvparams", "start"]:
537 8a47b447 Michael Hanselmann
      self.assertFalse(field in data)
538 8a47b447 Michael Hanselmann
539 8a47b447 Michael Hanselmann
    self.assertEqual(data["name"], "inst1.example.com")
540 8a47b447 Michael Hanselmann
    self.assertEqual(data["disk_template"], "plain")
541 8a47b447 Michael Hanselmann
542 8a47b447 Michael Hanselmann
  def testCreateInstance2(self):
543 8a47b447 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_CREATE_REQV1]))
544 8a47b447 Michael Hanselmann
    self.rapi.AddResponse("24740")
545 8a47b447 Michael Hanselmann
    job_id = self.client.CreateInstance("import", "inst2.example.com",
546 8a47b447 Michael Hanselmann
                                        "drbd8", [{"size": 100,}],
547 8a47b447 Michael Hanselmann
                                        [{}, {"bridge": "br1", }],
548 8a47b447 Michael Hanselmann
                                        dry_run=False, start=True,
549 8a47b447 Michael Hanselmann
                                        pnode="node1", snode="node9",
550 8a47b447 Michael Hanselmann
                                        ip_check=False)
551 8a47b447 Michael Hanselmann
    self.assertEqual(job_id, 24740)
552 8a47b447 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances)
553 8a47b447 Michael Hanselmann
554 2a7c3583 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
555 8a47b447 Michael Hanselmann
    self.assertEqual(data[rlib2._REQ_DATA_VERSION], 1)
556 8a47b447 Michael Hanselmann
    self.assertEqual(data["name"], "inst2.example.com")
557 8a47b447 Michael Hanselmann
    self.assertEqual(data["disk_template"], "drbd8")
558 8a47b447 Michael Hanselmann
    self.assertEqual(data["start"], True)
559 8a47b447 Michael Hanselmann
    self.assertEqual(data["ip_check"], False)
560 8a47b447 Michael Hanselmann
    self.assertEqualValues(data["disks"], [{"size": 100,}])
561 8a47b447 Michael Hanselmann
    self.assertEqualValues(data["nics"], [{}, {"bridge": "br1", }])
562 8a47b447 Michael Hanselmann
563 95ab4de9 David Knowles
  def testDeleteInstance(self):
564 cab667cc David Knowles
    self.rapi.AddResponse("1234")
565 cab667cc David Knowles
    self.assertEqual(1234, self.client.DeleteInstance("instance", dry_run=True))
566 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
567 95ab4de9 David Knowles
    self.assertItems(["instance"])
568 95ab4de9 David Knowles
    self.assertDryRun()
569 95ab4de9 David Knowles
570 95ab4de9 David Knowles
  def testGetInstanceTags(self):
571 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
572 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstanceTags("fooinstance"))
573 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
574 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
575 95ab4de9 David Knowles
576 95ab4de9 David Knowles
  def testAddInstanceTags(self):
577 cab667cc David Knowles
    self.rapi.AddResponse("1234")
578 cab667cc David Knowles
    self.assertEqual(1234,
579 cab667cc David Knowles
        self.client.AddInstanceTags("fooinstance", ["awesome"], dry_run=True))
580 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
581 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
582 95ab4de9 David Knowles
    self.assertDryRun()
583 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
584 95ab4de9 David Knowles
585 95ab4de9 David Knowles
  def testDeleteInstanceTags(self):
586 cd577680 Michael Hanselmann
    self.rapi.AddResponse("25826")
587 cd577680 Michael Hanselmann
    self.assertEqual(25826, self.client.DeleteInstanceTags("foo", ["awesome"],
588 cd577680 Michael Hanselmann
                                                           dry_run=True))
589 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
590 95ab4de9 David Knowles
    self.assertItems(["foo"])
591 95ab4de9 David Knowles
    self.assertDryRun()
592 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
593 95ab4de9 David Knowles
594 95ab4de9 David Knowles
  def testRebootInstance(self):
595 cd577680 Michael Hanselmann
    self.rapi.AddResponse("6146")
596 cd577680 Michael Hanselmann
    job_id = self.client.RebootInstance("i-bar", reboot_type="hard",
597 cd577680 Michael Hanselmann
                                        ignore_secondaries=True, dry_run=True)
598 cd577680 Michael Hanselmann
    self.assertEqual(6146, job_id)
599 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reboot)
600 95ab4de9 David Knowles
    self.assertItems(["i-bar"])
601 95ab4de9 David Knowles
    self.assertDryRun()
602 95ab4de9 David Knowles
    self.assertQuery("type", ["hard"])
603 10f5ab6c Michael Hanselmann
    self.assertQuery("ignore_secondaries", ["1"])
604 95ab4de9 David Knowles
605 95ab4de9 David Knowles
  def testShutdownInstance(self):
606 cd577680 Michael Hanselmann
    self.rapi.AddResponse("1487")
607 cd577680 Michael Hanselmann
    self.assertEqual(1487, self.client.ShutdownInstance("foo-instance",
608 cd577680 Michael Hanselmann
                                                        dry_run=True))
609 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_shutdown)
610 95ab4de9 David Knowles
    self.assertItems(["foo-instance"])
611 95ab4de9 David Knowles
    self.assertDryRun()
612 95ab4de9 David Knowles
613 95ab4de9 David Knowles
  def testStartupInstance(self):
614 cd577680 Michael Hanselmann
    self.rapi.AddResponse("27149")
615 cd577680 Michael Hanselmann
    self.assertEqual(27149, self.client.StartupInstance("bar-instance",
616 cd577680 Michael Hanselmann
                                                        dry_run=True))
617 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_startup)
618 95ab4de9 David Knowles
    self.assertItems(["bar-instance"])
619 95ab4de9 David Knowles
    self.assertDryRun()
620 95ab4de9 David Knowles
621 95ab4de9 David Knowles
  def testReinstallInstance(self):
622 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
623 cd577680 Michael Hanselmann
    self.rapi.AddResponse("19119")
624 fcee9675 David Knowles
    self.assertEqual(19119, self.client.ReinstallInstance("baz-instance",
625 fcee9675 David Knowles
                                                          os="DOS",
626 cd577680 Michael Hanselmann
                                                          no_startup=True))
627 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
628 95ab4de9 David Knowles
    self.assertItems(["baz-instance"])
629 95ab4de9 David Knowles
    self.assertQuery("os", ["DOS"])
630 95ab4de9 David Knowles
    self.assertQuery("nostartup", ["1"])
631 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
632 c744425f Michael Hanselmann
633 c744425f Michael Hanselmann
  def testReinstallInstanceNew(self):
634 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_REINSTALL_REQV1]))
635 c744425f Michael Hanselmann
    self.rapi.AddResponse("25689")
636 c744425f Michael Hanselmann
    self.assertEqual(25689, self.client.ReinstallInstance("moo-instance",
637 c744425f Michael Hanselmann
                                                          os="Debian",
638 c744425f Michael Hanselmann
                                                          no_startup=True))
639 c744425f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
640 c744425f Michael Hanselmann
    self.assertItems(["moo-instance"])
641 c744425f Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
642 c744425f Michael Hanselmann
    self.assertEqual(len(data), 2)
643 c744425f Michael Hanselmann
    self.assertEqual(data["os"], "Debian")
644 c744425f Michael Hanselmann
    self.assertEqual(data["start"], False)
645 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
646 c744425f Michael Hanselmann
647 c744425f Michael Hanselmann
  def testReinstallInstanceWithOsparams1(self):
648 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
649 c744425f Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.ReinstallInstance,
650 c744425f Michael Hanselmann
                      "doo-instance", osparams={"x": "y"})
651 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
652 c744425f Michael Hanselmann
653 c744425f Michael Hanselmann
  def testReinstallInstanceWithOsparams2(self):
654 c744425f Michael Hanselmann
    osparams = {
655 c744425f Michael Hanselmann
      "Hello": "World",
656 c744425f Michael Hanselmann
      "foo": "bar",
657 c744425f Michael Hanselmann
      }
658 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_REINSTALL_REQV1]))
659 c744425f Michael Hanselmann
    self.rapi.AddResponse("1717")
660 c744425f Michael Hanselmann
    self.assertEqual(1717, self.client.ReinstallInstance("zoo-instance",
661 c744425f Michael Hanselmann
                                                         osparams=osparams))
662 c744425f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
663 c744425f Michael Hanselmann
    self.assertItems(["zoo-instance"])
664 c744425f Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
665 c744425f Michael Hanselmann
    self.assertEqual(len(data), 2)
666 c744425f Michael Hanselmann
    self.assertEqual(data["osparams"], osparams)
667 c744425f Michael Hanselmann
    self.assertEqual(data["start"], True)
668 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
669 95ab4de9 David Knowles
670 95ab4de9 David Knowles
  def testReplaceInstanceDisks(self):
671 95ab4de9 David Knowles
    self.rapi.AddResponse("999")
672 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-name",
673 539d65ba Michael Hanselmann
        disks=[0, 1], iallocator="hail")
674 95ab4de9 David Knowles
    self.assertEqual(999, job_id)
675 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_replace_disks)
676 95ab4de9 David Knowles
    self.assertItems(["instance-name"])
677 bfc2002f Michael Hanselmann
    self.assertQuery("disks", ["0,1"])
678 95ab4de9 David Knowles
    self.assertQuery("mode", ["replace_auto"])
679 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
680 95ab4de9 David Knowles
681 95ab4de9 David Knowles
    self.rapi.AddResponse("1000")
682 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-bar",
683 539d65ba Michael Hanselmann
        disks=[1], mode="replace_on_secondary", remote_node="foo-node")
684 95ab4de9 David Knowles
    self.assertEqual(1000, job_id)
685 95ab4de9 David Knowles
    self.assertItems(["instance-bar"])
686 bfc2002f Michael Hanselmann
    self.assertQuery("disks", ["1"])
687 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["foo-node"])
688 95ab4de9 David Knowles
689 bfc2002f Michael Hanselmann
    self.rapi.AddResponse("5175")
690 bfc2002f Michael Hanselmann
    self.assertEqual(5175, self.client.ReplaceInstanceDisks("instance-moo"))
691 bfc2002f Michael Hanselmann
    self.assertItems(["instance-moo"])
692 bfc2002f Michael Hanselmann
    self.assertQuery("disks", None)
693 bfc2002f Michael Hanselmann
694 ebeb600f Michael Hanselmann
  def testPrepareExport(self):
695 ebeb600f Michael Hanselmann
    self.rapi.AddResponse("8326")
696 ebeb600f Michael Hanselmann
    self.assertEqual(8326, self.client.PrepareExport("inst1", "local"))
697 ebeb600f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_prepare_export)
698 ebeb600f Michael Hanselmann
    self.assertItems(["inst1"])
699 ebeb600f Michael Hanselmann
    self.assertQuery("mode", ["local"])
700 ebeb600f Michael Hanselmann
701 ebeb600f Michael Hanselmann
  def testExportInstance(self):
702 ebeb600f Michael Hanselmann
    self.rapi.AddResponse("19695")
703 ebeb600f Michael Hanselmann
    job_id = self.client.ExportInstance("inst2", "local", "nodeX",
704 ebeb600f Michael Hanselmann
                                        shutdown=True)
705 ebeb600f Michael Hanselmann
    self.assertEqual(job_id, 19695)
706 ebeb600f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_export)
707 ebeb600f Michael Hanselmann
    self.assertItems(["inst2"])
708 ebeb600f Michael Hanselmann
709 2a7c3583 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
710 ebeb600f Michael Hanselmann
    self.assertEqual(data["mode"], "local")
711 ebeb600f Michael Hanselmann
    self.assertEqual(data["destination"], "nodeX")
712 ebeb600f Michael Hanselmann
    self.assertEqual(data["shutdown"], True)
713 ebeb600f Michael Hanselmann
714 e0ac6ce6 Michael Hanselmann
  def testMigrateInstanceDefaults(self):
715 e0ac6ce6 Michael Hanselmann
    self.rapi.AddResponse("24873")
716 e0ac6ce6 Michael Hanselmann
    job_id = self.client.MigrateInstance("inst91")
717 e0ac6ce6 Michael Hanselmann
    self.assertEqual(job_id, 24873)
718 e0ac6ce6 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_migrate)
719 e0ac6ce6 Michael Hanselmann
    self.assertItems(["inst91"])
720 e0ac6ce6 Michael Hanselmann
721 e0ac6ce6 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
722 e0ac6ce6 Michael Hanselmann
    self.assertFalse(data)
723 e0ac6ce6 Michael Hanselmann
724 e0ac6ce6 Michael Hanselmann
  def testMigrateInstance(self):
725 e0ac6ce6 Michael Hanselmann
    for mode in constants.HT_MIGRATION_MODES:
726 e0ac6ce6 Michael Hanselmann
      for cleanup in [False, True]:
727 e0ac6ce6 Michael Hanselmann
        self.rapi.AddResponse("31910")
728 e0ac6ce6 Michael Hanselmann
        job_id = self.client.MigrateInstance("inst289", mode=mode,
729 e0ac6ce6 Michael Hanselmann
                                             cleanup=cleanup)
730 e0ac6ce6 Michael Hanselmann
        self.assertEqual(job_id, 31910)
731 e0ac6ce6 Michael Hanselmann
        self.assertHandler(rlib2.R_2_instances_name_migrate)
732 e0ac6ce6 Michael Hanselmann
        self.assertItems(["inst289"])
733 e0ac6ce6 Michael Hanselmann
734 e0ac6ce6 Michael Hanselmann
        data = serializer.LoadJson(self.rapi.GetLastRequestData())
735 e0ac6ce6 Michael Hanselmann
        self.assertEqual(len(data), 2)
736 e0ac6ce6 Michael Hanselmann
        self.assertEqual(data["mode"], mode)
737 e0ac6ce6 Michael Hanselmann
        self.assertEqual(data["cleanup"], cleanup)
738 e0ac6ce6 Michael Hanselmann
739 c0a146a1 Michael Hanselmann
  def testFailoverInstanceDefaults(self):
740 c0a146a1 Michael Hanselmann
    self.rapi.AddResponse("7639")
741 c0a146a1 Michael Hanselmann
    job_id = self.client.FailoverInstance("inst13579")
742 c0a146a1 Michael Hanselmann
    self.assertEqual(job_id, 7639)
743 c0a146a1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_failover)
744 c0a146a1 Michael Hanselmann
    self.assertItems(["inst13579"])
745 c0a146a1 Michael Hanselmann
746 c0a146a1 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
747 c0a146a1 Michael Hanselmann
    self.assertFalse(data)
748 c0a146a1 Michael Hanselmann
749 c0a146a1 Michael Hanselmann
  def testFailoverInstance(self):
750 c0a146a1 Michael Hanselmann
    for iallocator in ["dumb", "hail"]:
751 c0a146a1 Michael Hanselmann
      for ignore_consistency in [False, True]:
752 c0a146a1 Michael Hanselmann
        for target_node in ["node-a", "node2"]:
753 c0a146a1 Michael Hanselmann
          self.rapi.AddResponse("19161")
754 c0a146a1 Michael Hanselmann
          job_id = \
755 c0a146a1 Michael Hanselmann
            self.client.FailoverInstance("inst251", iallocator=iallocator,
756 c0a146a1 Michael Hanselmann
                                         ignore_consistency=ignore_consistency,
757 c0a146a1 Michael Hanselmann
                                         target_node=target_node)
758 c0a146a1 Michael Hanselmann
          self.assertEqual(job_id, 19161)
759 c0a146a1 Michael Hanselmann
          self.assertHandler(rlib2.R_2_instances_name_failover)
760 c0a146a1 Michael Hanselmann
          self.assertItems(["inst251"])
761 c0a146a1 Michael Hanselmann
762 c0a146a1 Michael Hanselmann
          data = serializer.LoadJson(self.rapi.GetLastRequestData())
763 c0a146a1 Michael Hanselmann
          self.assertEqual(len(data), 3)
764 c0a146a1 Michael Hanselmann
          self.assertEqual(data["iallocator"], iallocator)
765 c0a146a1 Michael Hanselmann
          self.assertEqual(data["ignore_consistency"], ignore_consistency)
766 c0a146a1 Michael Hanselmann
          self.assertEqual(data["target_node"], target_node)
767 c0a146a1 Michael Hanselmann
          self.assertEqual(self.rapi.CountPending(), 0)
768 c0a146a1 Michael Hanselmann
769 d654aae1 Michael Hanselmann
  def testRenameInstanceDefaults(self):
770 d654aae1 Michael Hanselmann
    new_name = "newnametha7euqu"
771 d654aae1 Michael Hanselmann
    self.rapi.AddResponse("8791")
772 d654aae1 Michael Hanselmann
    job_id = self.client.RenameInstance("inst18821", new_name)
773 d654aae1 Michael Hanselmann
    self.assertEqual(job_id, 8791)
774 d654aae1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_rename)
775 d654aae1 Michael Hanselmann
    self.assertItems(["inst18821"])
776 d654aae1 Michael Hanselmann
777 d654aae1 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
778 d654aae1 Michael Hanselmann
    self.assertEqualValues(data, {"new_name": new_name, })
779 d654aae1 Michael Hanselmann
780 d654aae1 Michael Hanselmann
  def testRenameInstance(self):
781 d654aae1 Michael Hanselmann
    new_name = "new-name-yiux1iin"
782 d654aae1 Michael Hanselmann
    for ip_check in [False, True]:
783 d654aae1 Michael Hanselmann
      for name_check in [False, True]:
784 d654aae1 Michael Hanselmann
        self.rapi.AddResponse("24776")
785 d654aae1 Michael Hanselmann
        job_id = self.client.RenameInstance("inst20967", new_name,
786 d654aae1 Michael Hanselmann
                                             ip_check=ip_check,
787 d654aae1 Michael Hanselmann
                                             name_check=name_check)
788 d654aae1 Michael Hanselmann
        self.assertEqual(job_id, 24776)
789 d654aae1 Michael Hanselmann
        self.assertHandler(rlib2.R_2_instances_name_rename)
790 d654aae1 Michael Hanselmann
        self.assertItems(["inst20967"])
791 d654aae1 Michael Hanselmann
792 d654aae1 Michael Hanselmann
        data = serializer.LoadJson(self.rapi.GetLastRequestData())
793 d654aae1 Michael Hanselmann
        self.assertEqual(len(data), 3)
794 d654aae1 Michael Hanselmann
        self.assertEqual(data["new_name"], new_name)
795 d654aae1 Michael Hanselmann
        self.assertEqual(data["ip_check"], ip_check)
796 d654aae1 Michael Hanselmann
        self.assertEqual(data["name_check"], name_check)
797 d654aae1 Michael Hanselmann
798 95ab4de9 David Knowles
  def testGetJobs(self):
799 2004e673 Iustin Pop
    self.rapi.AddResponse('[ { "id": "123", "uri": "\\/2\\/jobs\\/123" },'
800 2004e673 Iustin Pop
                          '  { "id": "124", "uri": "\\/2\\/jobs\\/124" } ]')
801 95ab4de9 David Knowles
    self.assertEqual([123, 124], self.client.GetJobs())
802 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs)
803 95ab4de9 David Knowles
804 95ab4de9 David Knowles
  def testGetJobStatus(self):
805 95ab4de9 David Knowles
    self.rapi.AddResponse("{\"foo\": \"bar\"}")
806 95ab4de9 David Knowles
    self.assertEqual({"foo": "bar"}, self.client.GetJobStatus(1234))
807 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
808 95ab4de9 David Knowles
    self.assertItems(["1234"])
809 95ab4de9 David Knowles
810 d9b67f70 Michael Hanselmann
  def testWaitForJobChange(self):
811 d9b67f70 Michael Hanselmann
    fields = ["id", "summary"]
812 d9b67f70 Michael Hanselmann
    expected = {
813 d9b67f70 Michael Hanselmann
      "job_info": [123, "something"],
814 d9b67f70 Michael Hanselmann
      "log_entries": [],
815 d9b67f70 Michael Hanselmann
      }
816 d9b67f70 Michael Hanselmann
817 d9b67f70 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson(expected))
818 d9b67f70 Michael Hanselmann
    result = self.client.WaitForJobChange(123, fields, [], -1)
819 d9b67f70 Michael Hanselmann
    self.assertEqualValues(expected, result)
820 d9b67f70 Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id_wait)
821 d9b67f70 Michael Hanselmann
    self.assertItems(["123"])
822 d9b67f70 Michael Hanselmann
823 cf9ada49 Michael Hanselmann
  def testCancelJob(self):
824 cd577680 Michael Hanselmann
    self.rapi.AddResponse("[true, \"Job 123 will be canceled\"]")
825 cd577680 Michael Hanselmann
    self.assertEqual([True, "Job 123 will be canceled"],
826 cf9ada49 Michael Hanselmann
                     self.client.CancelJob(999, dry_run=True))
827 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
828 95ab4de9 David Knowles
    self.assertItems(["999"])
829 95ab4de9 David Knowles
    self.assertDryRun()
830 95ab4de9 David Knowles
831 95ab4de9 David Knowles
  def testGetNodes(self):
832 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
833 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
834 95ab4de9 David Knowles
    self.assertEqual(["node1", "node2"], self.client.GetNodes())
835 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
836 95ab4de9 David Knowles
837 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
838 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
839 95ab4de9 David Knowles
    self.assertEqual([{"id": "node1", "uri": "uri1"},
840 95ab4de9 David Knowles
                      {"id": "node2", "uri": "uri2"}],
841 95ab4de9 David Knowles
                     self.client.GetNodes(bulk=True))
842 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
843 95ab4de9 David Knowles
    self.assertBulk()
844 95ab4de9 David Knowles
845 591e5103 Michael Hanselmann
  def testGetNode(self):
846 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
847 591e5103 Michael Hanselmann
    self.assertEqual({}, self.client.GetNode("node-foo"))
848 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name)
849 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
850 95ab4de9 David Knowles
851 95ab4de9 David Knowles
  def testEvacuateNode(self):
852 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_EVAC_RES1]))
853 95ab4de9 David Knowles
    self.rapi.AddResponse("9876")
854 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-1", remote_node="node-2")
855 95ab4de9 David Knowles
    self.assertEqual(9876, job_id)
856 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_evacuate)
857 95ab4de9 David Knowles
    self.assertItems(["node-1"])
858 de40437a Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
859 de40437a Michael Hanselmann
                     { "remote_node": "node-2", })
860 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
861 95ab4de9 David Knowles
862 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_EVAC_RES1]))
863 95ab4de9 David Knowles
    self.rapi.AddResponse("8888")
864 0b58db81 Michael Hanselmann
    job_id = self.client.EvacuateNode("node-3", iallocator="hail", dry_run=True,
865 cb92e7a1 Michael Hanselmann
                                      mode=constants.NODE_EVAC_ALL,
866 0b58db81 Michael Hanselmann
                                      early_release=True)
867 95ab4de9 David Knowles
    self.assertEqual(8888, job_id)
868 95ab4de9 David Knowles
    self.assertItems(["node-3"])
869 0b58db81 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()), {
870 0b58db81 Michael Hanselmann
      "iallocator": "hail",
871 0b58db81 Michael Hanselmann
      "mode": "all",
872 0b58db81 Michael Hanselmann
      "early_release": True,
873 0b58db81 Michael Hanselmann
      })
874 95ab4de9 David Knowles
    self.assertDryRun()
875 95ab4de9 David Knowles
876 95ab4de9 David Knowles
    self.assertRaises(client.GanetiApiError,
877 95ab4de9 David Knowles
                      self.client.EvacuateNode,
878 95ab4de9 David Knowles
                      "node-4", iallocator="hail", remote_node="node-5")
879 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
880 de40437a Michael Hanselmann
881 de40437a Michael Hanselmann
  def testEvacuateNodeOldResponse(self):
882 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
883 de40437a Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.EvacuateNode,
884 de40437a Michael Hanselmann
                      "node-4", accept_old=False)
885 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
886 de40437a Michael Hanselmann
887 0b58db81 Michael Hanselmann
    for mode in [client.NODE_EVAC_PRI, client.NODE_EVAC_ALL]:
888 0b58db81 Michael Hanselmann
      self.rapi.AddResponse(serializer.DumpJson([]))
889 0b58db81 Michael Hanselmann
      self.assertRaises(client.GanetiApiError, self.client.EvacuateNode,
890 0b58db81 Michael Hanselmann
                        "node-4", accept_old=True, mode=mode)
891 0b58db81 Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
892 de40437a Michael Hanselmann
893 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
894 0b58db81 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson("21533"))
895 0b58db81 Michael Hanselmann
    result = self.client.EvacuateNode("node-3", iallocator="hail",
896 0b58db81 Michael Hanselmann
                                      dry_run=True, accept_old=True,
897 0b58db81 Michael Hanselmann
                                      mode=client.NODE_EVAC_SEC,
898 0b58db81 Michael Hanselmann
                                      early_release=True)
899 0b58db81 Michael Hanselmann
    self.assertEqual(result, "21533")
900 0b58db81 Michael Hanselmann
    self.assertItems(["node-3"])
901 0b58db81 Michael Hanselmann
    self.assertQuery("iallocator", ["hail"])
902 0b58db81 Michael Hanselmann
    self.assertQuery("early_release", ["1"])
903 0b58db81 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
904 0b58db81 Michael Hanselmann
    self.assertDryRun()
905 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
906 de40437a Michael Hanselmann
907 95ab4de9 David Knowles
  def testMigrateNode(self):
908 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
909 95ab4de9 David Knowles
    self.rapi.AddResponse("1111")
910 95ab4de9 David Knowles
    self.assertEqual(1111, self.client.MigrateNode("node-a", dry_run=True))
911 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
912 95ab4de9 David Knowles
    self.assertItems(["node-a"])
913 1f334d96 Iustin Pop
    self.assert_("mode" not in self.rapi.GetLastHandler().queryargs)
914 1f334d96 Iustin Pop
    self.assertDryRun()
915 b7a1c816 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
916 1f334d96 Iustin Pop
917 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
918 1f334d96 Iustin Pop
    self.rapi.AddResponse("1112")
919 1f334d96 Iustin Pop
    self.assertEqual(1112, self.client.MigrateNode("node-a", dry_run=True,
920 1f334d96 Iustin Pop
                                                   mode="live"))
921 1f334d96 Iustin Pop
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
922 1f334d96 Iustin Pop
    self.assertItems(["node-a"])
923 1f334d96 Iustin Pop
    self.assertQuery("mode", ["live"])
924 95ab4de9 David Knowles
    self.assertDryRun()
925 b7a1c816 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
926 b7a1c816 Michael Hanselmann
927 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
928 b7a1c816 Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.MigrateNode,
929 b7a1c816 Michael Hanselmann
                      "node-c", target_node="foonode")
930 b7a1c816 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
931 b7a1c816 Michael Hanselmann
932 b7a1c816 Michael Hanselmann
  def testMigrateNodeBodyData(self):
933 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_MIGRATE_REQV1]))
934 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse("27539")
935 b7a1c816 Michael Hanselmann
    self.assertEqual(27539, self.client.MigrateNode("node-a", dry_run=False,
936 b7a1c816 Michael Hanselmann
                                                    mode="live"))
937 b7a1c816 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
938 b7a1c816 Michael Hanselmann
    self.assertItems(["node-a"])
939 b7a1c816 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
940 b7a1c816 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
941 b7a1c816 Michael Hanselmann
                     { "mode": "live", })
942 b7a1c816 Michael Hanselmann
943 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_MIGRATE_REQV1]))
944 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse("14219")
945 b7a1c816 Michael Hanselmann
    self.assertEqual(14219, self.client.MigrateNode("node-x", dry_run=True,
946 b7a1c816 Michael Hanselmann
                                                    target_node="node9",
947 b7a1c816 Michael Hanselmann
                                                    iallocator="ial"))
948 b7a1c816 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
949 b7a1c816 Michael Hanselmann
    self.assertItems(["node-x"])
950 b7a1c816 Michael Hanselmann
    self.assertDryRun()
951 b7a1c816 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
952 b7a1c816 Michael Hanselmann
                     { "target_node": "node9", "iallocator": "ial", })
953 b7a1c816 Michael Hanselmann
954 b7a1c816 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
955 95ab4de9 David Knowles
956 95ab4de9 David Knowles
  def testGetNodeRole(self):
957 95ab4de9 David Knowles
    self.rapi.AddResponse("\"master\"")
958 95ab4de9 David Knowles
    self.assertEqual("master", self.client.GetNodeRole("node-a"))
959 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
960 95ab4de9 David Knowles
    self.assertItems(["node-a"])
961 95ab4de9 David Knowles
962 95ab4de9 David Knowles
  def testSetNodeRole(self):
963 95ab4de9 David Knowles
    self.rapi.AddResponse("789")
964 95ab4de9 David Knowles
    self.assertEqual(789,
965 95ab4de9 David Knowles
        self.client.SetNodeRole("node-foo", "master-candidate", force=True))
966 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
967 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
968 10f5ab6c Michael Hanselmann
    self.assertQuery("force", ["1"])
969 2a7c3583 Michael Hanselmann
    self.assertEqual("\"master-candidate\"", self.rapi.GetLastRequestData())
970 95ab4de9 David Knowles
971 42d4d8b9 Michael Hanselmann
  def testPowercycleNode(self):
972 42d4d8b9 Michael Hanselmann
    self.rapi.AddResponse("23051")
973 42d4d8b9 Michael Hanselmann
    self.assertEqual(23051,
974 42d4d8b9 Michael Hanselmann
        self.client.PowercycleNode("node5468", force=True))
975 42d4d8b9 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_powercycle)
976 42d4d8b9 Michael Hanselmann
    self.assertItems(["node5468"])
977 42d4d8b9 Michael Hanselmann
    self.assertQuery("force", ["1"])
978 42d4d8b9 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
979 42d4d8b9 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
980 42d4d8b9 Michael Hanselmann
981 94497dd1 Michael Hanselmann
  def testModifyNode(self):
982 94497dd1 Michael Hanselmann
    self.rapi.AddResponse("3783")
983 94497dd1 Michael Hanselmann
    job_id = self.client.ModifyNode("node16979.example.com", drained=True)
984 94497dd1 Michael Hanselmann
    self.assertEqual(job_id, 3783)
985 94497dd1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_modify)
986 94497dd1 Michael Hanselmann
    self.assertItems(["node16979.example.com"])
987 94497dd1 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
988 94497dd1 Michael Hanselmann
989 95ab4de9 David Knowles
  def testGetNodeStorageUnits(self):
990 95ab4de9 David Knowles
    self.rapi.AddResponse("42")
991 95ab4de9 David Knowles
    self.assertEqual(42,
992 95ab4de9 David Knowles
        self.client.GetNodeStorageUnits("node-x", "lvm-pv", "fields"))
993 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage)
994 95ab4de9 David Knowles
    self.assertItems(["node-x"])
995 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
996 95ab4de9 David Knowles
    self.assertQuery("output_fields", ["fields"])
997 95ab4de9 David Knowles
998 95ab4de9 David Knowles
  def testModifyNodeStorageUnits(self):
999 95ab4de9 David Knowles
    self.rapi.AddResponse("14")
1000 95ab4de9 David Knowles
    self.assertEqual(14,
1001 95ab4de9 David Knowles
        self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda"))
1002 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
1003 95ab4de9 David Knowles
    self.assertItems(["node-z"])
1004 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
1005 95ab4de9 David Knowles
    self.assertQuery("name", ["hda"])
1006 fde28316 Michael Hanselmann
    self.assertQuery("allocatable", None)
1007 fde28316 Michael Hanselmann
1008 fde28316 Michael Hanselmann
    for allocatable, query_allocatable in [(True, "1"), (False, "0")]:
1009 fde28316 Michael Hanselmann
      self.rapi.AddResponse("7205")
1010 fde28316 Michael Hanselmann
      job_id = self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda",
1011 fde28316 Michael Hanselmann
                                                  allocatable=allocatable)
1012 fde28316 Michael Hanselmann
      self.assertEqual(7205, job_id)
1013 fde28316 Michael Hanselmann
      self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
1014 fde28316 Michael Hanselmann
      self.assertItems(["node-z"])
1015 fde28316 Michael Hanselmann
      self.assertQuery("storage_type", ["lvm-pv"])
1016 fde28316 Michael Hanselmann
      self.assertQuery("name", ["hda"])
1017 fde28316 Michael Hanselmann
      self.assertQuery("allocatable", [query_allocatable])
1018 95ab4de9 David Knowles
1019 752df8bb Michael Hanselmann
  def testRepairNodeStorageUnits(self):
1020 752df8bb Michael Hanselmann
    self.rapi.AddResponse("99")
1021 752df8bb Michael Hanselmann
    self.assertEqual(99, self.client.RepairNodeStorageUnits("node-z", "lvm-pv",
1022 752df8bb Michael Hanselmann
                                                            "hda"))
1023 752df8bb Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_storage_repair)
1024 752df8bb Michael Hanselmann
    self.assertItems(["node-z"])
1025 752df8bb Michael Hanselmann
    self.assertQuery("storage_type", ["lvm-pv"])
1026 752df8bb Michael Hanselmann
    self.assertQuery("name", ["hda"])
1027 752df8bb Michael Hanselmann
1028 95ab4de9 David Knowles
  def testGetNodeTags(self):
1029 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"fry\", \"bender\"]")
1030 95ab4de9 David Knowles
    self.assertEqual(["fry", "bender"], self.client.GetNodeTags("node-k"))
1031 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1032 95ab4de9 David Knowles
    self.assertItems(["node-k"])
1033 95ab4de9 David Knowles
1034 95ab4de9 David Knowles
  def testAddNodeTags(self):
1035 cab667cc David Knowles
    self.rapi.AddResponse("1234")
1036 cab667cc David Knowles
    self.assertEqual(1234,
1037 cab667cc David Knowles
        self.client.AddNodeTags("node-v", ["awesome"], dry_run=True))
1038 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1039 95ab4de9 David Knowles
    self.assertItems(["node-v"])
1040 95ab4de9 David Knowles
    self.assertDryRun()
1041 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
1042 95ab4de9 David Knowles
1043 95ab4de9 David Knowles
  def testDeleteNodeTags(self):
1044 cd577680 Michael Hanselmann
    self.rapi.AddResponse("16861")
1045 cd577680 Michael Hanselmann
    self.assertEqual(16861, self.client.DeleteNodeTags("node-w", ["awesome"],
1046 cd577680 Michael Hanselmann
                                                       dry_run=True))
1047 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1048 95ab4de9 David Knowles
    self.assertItems(["node-w"])
1049 95ab4de9 David Knowles
    self.assertDryRun()
1050 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
1051 95ab4de9 David Knowles
1052 a268af8d Adeodato Simo
  def testGetGroups(self):
1053 a268af8d Adeodato Simo
    groups = [{"name": "group1",
1054 a268af8d Adeodato Simo
               "uri": "/2/groups/group1",
1055 a268af8d Adeodato Simo
               },
1056 a268af8d Adeodato Simo
              {"name": "group2",
1057 a268af8d Adeodato Simo
               "uri": "/2/groups/group2",
1058 a268af8d Adeodato Simo
               },
1059 a268af8d Adeodato Simo
              ]
1060 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(groups))
1061 a268af8d Adeodato Simo
    self.assertEqual(["group1", "group2"], self.client.GetGroups())
1062 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1063 a268af8d Adeodato Simo
1064 a268af8d Adeodato Simo
  def testGetGroupsBulk(self):
1065 a268af8d Adeodato Simo
    groups = [{"name": "group1",
1066 a268af8d Adeodato Simo
               "uri": "/2/groups/group1",
1067 a268af8d Adeodato Simo
               "node_cnt": 2,
1068 a268af8d Adeodato Simo
               "node_list": ["gnt1.test",
1069 a268af8d Adeodato Simo
                             "gnt2.test",
1070 a268af8d Adeodato Simo
                             ],
1071 a268af8d Adeodato Simo
               },
1072 a268af8d Adeodato Simo
              {"name": "group2",
1073 a268af8d Adeodato Simo
               "uri": "/2/groups/group2",
1074 a268af8d Adeodato Simo
               "node_cnt": 1,
1075 a268af8d Adeodato Simo
               "node_list": ["gnt3.test",
1076 a268af8d Adeodato Simo
                             ],
1077 a268af8d Adeodato Simo
               },
1078 a268af8d Adeodato Simo
              ]
1079 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(groups))
1080 a268af8d Adeodato Simo
1081 a268af8d Adeodato Simo
    self.assertEqual(groups, self.client.GetGroups(bulk=True))
1082 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1083 a268af8d Adeodato Simo
    self.assertBulk()
1084 a268af8d Adeodato Simo
1085 a268af8d Adeodato Simo
  def testGetGroup(self):
1086 a268af8d Adeodato Simo
    group = {"ctime": None,
1087 a268af8d Adeodato Simo
             "name": "default",
1088 a268af8d Adeodato Simo
             }
1089 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(group))
1090 a268af8d Adeodato Simo
    self.assertEqual({"ctime": None, "name": "default"},
1091 a268af8d Adeodato Simo
                     self.client.GetGroup("default"))
1092 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name)
1093 a268af8d Adeodato Simo
    self.assertItems(["default"])
1094 a268af8d Adeodato Simo
1095 a268af8d Adeodato Simo
  def testCreateGroup(self):
1096 a268af8d Adeodato Simo
    self.rapi.AddResponse("12345")
1097 a268af8d Adeodato Simo
    job_id = self.client.CreateGroup("newgroup", dry_run=True)
1098 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12345)
1099 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1100 a268af8d Adeodato Simo
    self.assertDryRun()
1101 a268af8d Adeodato Simo
1102 a268af8d Adeodato Simo
  def testDeleteGroup(self):
1103 a268af8d Adeodato Simo
    self.rapi.AddResponse("12346")
1104 a268af8d Adeodato Simo
    job_id = self.client.DeleteGroup("newgroup", dry_run=True)
1105 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12346)
1106 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name)
1107 a268af8d Adeodato Simo
    self.assertDryRun()
1108 a268af8d Adeodato Simo
1109 a268af8d Adeodato Simo
  def testRenameGroup(self):
1110 a268af8d Adeodato Simo
    self.rapi.AddResponse("12347")
1111 a268af8d Adeodato Simo
    job_id = self.client.RenameGroup("oldname", "newname")
1112 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12347)
1113 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_rename)
1114 a268af8d Adeodato Simo
1115 7187e6ff Adeodato Simo
  def testModifyGroup(self):
1116 7187e6ff Adeodato Simo
    self.rapi.AddResponse("12348")
1117 7187e6ff Adeodato Simo
    job_id = self.client.ModifyGroup("mygroup", alloc_policy="foo")
1118 7187e6ff Adeodato Simo
    self.assertEqual(job_id, 12348)
1119 7187e6ff Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_modify)
1120 7187e6ff Adeodato Simo
1121 4245446f Adeodato Simo
  def testAssignGroupNodes(self):
1122 4245446f Adeodato Simo
    self.rapi.AddResponse("12349")
1123 4245446f Adeodato Simo
    job_id = self.client.AssignGroupNodes("mygroup", ["node1", "node2"],
1124 4245446f Adeodato Simo
                                          force=True, dry_run=True)
1125 4245446f Adeodato Simo
    self.assertEqual(job_id, 12349)
1126 4245446f Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_assign_nodes)
1127 4245446f Adeodato Simo
    self.assertDryRun()
1128 4245446f Adeodato Simo
    self.assertUseForce()
1129 4245446f Adeodato Simo
1130 6e8091f9 Dimitris Aragiorgis
  def testGetNetworksBulk(self):
1131 6e8091f9 Dimitris Aragiorgis
    networks = [{"name": "network1",
1132 6e8091f9 Dimitris Aragiorgis
               "uri": "/2/networks/network1",
1133 6e8091f9 Dimitris Aragiorgis
               "network": "192.168.0.0/24",
1134 6e8091f9 Dimitris Aragiorgis
               },
1135 6e8091f9 Dimitris Aragiorgis
              {"name": "network2",
1136 6e8091f9 Dimitris Aragiorgis
               "uri": "/2/networks/network2",
1137 6e8091f9 Dimitris Aragiorgis
               "network": "192.168.0.0/24",
1138 6e8091f9 Dimitris Aragiorgis
               },
1139 6e8091f9 Dimitris Aragiorgis
              ]
1140 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse(serializer.DumpJson(networks))
1141 6e8091f9 Dimitris Aragiorgis
1142 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(networks, self.client.GetNetworks(bulk=True))
1143 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks)
1144 6e8091f9 Dimitris Aragiorgis
    self.assertBulk()
1145 6e8091f9 Dimitris Aragiorgis
1146 6e8091f9 Dimitris Aragiorgis
  def testGetNetwork(self):
1147 6e8091f9 Dimitris Aragiorgis
    network = {"ctime": None,
1148 6e8091f9 Dimitris Aragiorgis
               "name": "network1",
1149 6e8091f9 Dimitris Aragiorgis
               }
1150 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse(serializer.DumpJson(network))
1151 6e8091f9 Dimitris Aragiorgis
    self.assertEqual({"ctime": None, "name": "network1"},
1152 6e8091f9 Dimitris Aragiorgis
                     self.client.GetNetwork("network1"))
1153 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name)
1154 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["network1"])
1155 6e8091f9 Dimitris Aragiorgis
1156 6e8091f9 Dimitris Aragiorgis
  def testCreateNetwork(self):
1157 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12345")
1158 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.CreateNetwork("newnetwork", network="192.168.0.0/24",
1159 6e8091f9 Dimitris Aragiorgis
                                       dry_run=True)
1160 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12345)
1161 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks)
1162 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1163 6e8091f9 Dimitris Aragiorgis
1164 6e8091f9 Dimitris Aragiorgis
  def testModifyNetwork(self):
1165 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12346")
1166 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.ModifyNetwork("mynetwork", gateway="192.168.0.10",
1167 6e8091f9 Dimitris Aragiorgis
                                     dry_run=True)
1168 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12346)
1169 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_modify)
1170 6e8091f9 Dimitris Aragiorgis
1171 6e8091f9 Dimitris Aragiorgis
  def testDeleteNetwork(self):
1172 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12347")
1173 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.DeleteNetwork("newnetwork", dry_run=True)
1174 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12347)
1175 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name)
1176 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1177 6e8091f9 Dimitris Aragiorgis
1178 6e8091f9 Dimitris Aragiorgis
  def testConnectNetwork(self):
1179 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12348")
1180 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.ConnectNetwork("mynetwork", "default",
1181 6e8091f9 Dimitris Aragiorgis
                                        "bridged", "br0", dry_run=True)
1182 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12348)
1183 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_connect)
1184 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1185 6e8091f9 Dimitris Aragiorgis
1186 6e8091f9 Dimitris Aragiorgis
  def testDisconnectNetwork(self):
1187 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12349")
1188 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.DisconnectNetwork("mynetwork", "default", dry_run=True)
1189 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12349)
1190 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_disconnect)
1191 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1192 6e8091f9 Dimitris Aragiorgis
1193 6e8091f9 Dimitris Aragiorgis
  def testGetNetworkTags(self):
1194 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("[]")
1195 6e8091f9 Dimitris Aragiorgis
    self.assertEqual([], self.client.GetNetworkTags("fooNetwork"))
1196 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_tags)
1197 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["fooNetwork"])
1198 6e8091f9 Dimitris Aragiorgis
1199 6e8091f9 Dimitris Aragiorgis
  def testAddNetworkTags(self):
1200 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("1234")
1201 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(1234,
1202 6e8091f9 Dimitris Aragiorgis
        self.client.AddNetworkTags("fooNetwork", ["awesome"], dry_run=True))
1203 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_tags)
1204 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["fooNetwork"])
1205 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1206 6e8091f9 Dimitris Aragiorgis
    self.assertQuery("tag", ["awesome"])
1207 6e8091f9 Dimitris Aragiorgis
1208 6e8091f9 Dimitris Aragiorgis
  def testDeleteNetworkTags(self):
1209 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("25826")
1210 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(25826, self.client.DeleteNetworkTags("foo", ["awesome"],
1211 6e8091f9 Dimitris Aragiorgis
                                                          dry_run=True))
1212 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_tags)
1213 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["foo"])
1214 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1215 6e8091f9 Dimitris Aragiorgis
    self.assertQuery("tag", ["awesome"])
1216 6e8091f9 Dimitris Aragiorgis
1217 08c11c40 Michael Hanselmann
  def testModifyInstance(self):
1218 08c11c40 Michael Hanselmann
    self.rapi.AddResponse("23681")
1219 08c11c40 Michael Hanselmann
    job_id = self.client.ModifyInstance("inst7210", os_name="linux")
1220 08c11c40 Michael Hanselmann
    self.assertEqual(job_id, 23681)
1221 08c11c40 Michael Hanselmann
    self.assertItems(["inst7210"])
1222 08c11c40 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_modify)
1223 08c11c40 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
1224 08c11c40 Michael Hanselmann
                     { "os_name": "linux", })
1225 08c11c40 Michael Hanselmann
1226 62e999a5 Michael Hanselmann
  def testModifyCluster(self):
1227 62e999a5 Michael Hanselmann
    for mnh in [None, False, True]:
1228 62e999a5 Michael Hanselmann
      self.rapi.AddResponse("14470")
1229 62e999a5 Michael Hanselmann
      self.assertEqual(14470,
1230 62e999a5 Michael Hanselmann
        self.client.ModifyCluster(maintain_node_health=mnh))
1231 62e999a5 Michael Hanselmann
      self.assertHandler(rlib2.R_2_cluster_modify)
1232 62e999a5 Michael Hanselmann
      self.assertItems([])
1233 62e999a5 Michael Hanselmann
      data = serializer.LoadJson(self.rapi.GetLastRequestData())
1234 62e999a5 Michael Hanselmann
      self.assertEqual(len(data), 1)
1235 62e999a5 Michael Hanselmann
      self.assertEqual(data["maintain_node_health"], mnh)
1236 62e999a5 Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1237 62e999a5 Michael Hanselmann
1238 54d4c13b Michael Hanselmann
  def testRedistributeConfig(self):
1239 54d4c13b Michael Hanselmann
    self.rapi.AddResponse("3364")
1240 54d4c13b Michael Hanselmann
    job_id = self.client.RedistributeConfig()
1241 54d4c13b Michael Hanselmann
    self.assertEqual(job_id, 3364)
1242 54d4c13b Michael Hanselmann
    self.assertItems([])
1243 54d4c13b Michael Hanselmann
    self.assertHandler(rlib2.R_2_redist_config)
1244 54d4c13b Michael Hanselmann
1245 b680c8be Michael Hanselmann
  def testActivateInstanceDisks(self):
1246 b680c8be Michael Hanselmann
    self.rapi.AddResponse("23547")
1247 b680c8be Michael Hanselmann
    job_id = self.client.ActivateInstanceDisks("inst28204")
1248 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 23547)
1249 b680c8be Michael Hanselmann
    self.assertItems(["inst28204"])
1250 b680c8be Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_activate_disks)
1251 b680c8be Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1252 b680c8be Michael Hanselmann
1253 b680c8be Michael Hanselmann
  def testActivateInstanceDisksIgnoreSize(self):
1254 b680c8be Michael Hanselmann
    self.rapi.AddResponse("11044")
1255 b680c8be Michael Hanselmann
    job_id = self.client.ActivateInstanceDisks("inst28204", ignore_size=True)
1256 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 11044)
1257 b680c8be Michael Hanselmann
    self.assertItems(["inst28204"])
1258 b680c8be Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_activate_disks)
1259 b680c8be Michael Hanselmann
    self.assertQuery("ignore_size", ["1"])
1260 b680c8be Michael Hanselmann
1261 b680c8be Michael Hanselmann
  def testDeactivateInstanceDisks(self):
1262 b680c8be Michael Hanselmann
    self.rapi.AddResponse("14591")
1263 b680c8be Michael Hanselmann
    job_id = self.client.DeactivateInstanceDisks("inst28234")
1264 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 14591)
1265 b680c8be Michael Hanselmann
    self.assertItems(["inst28234"])
1266 b680c8be Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_deactivate_disks)
1267 b680c8be Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1268 b680c8be Michael Hanselmann
1269 a52978c7 Michael Hanselmann
  def testRecreateInstanceDisks(self):
1270 a52978c7 Michael Hanselmann
    self.rapi.AddResponse("13553")
1271 a52978c7 Michael Hanselmann
    job_id = self.client.RecreateInstanceDisks("inst23153")
1272 a52978c7 Michael Hanselmann
    self.assertEqual(job_id, 13553)
1273 a52978c7 Michael Hanselmann
    self.assertItems(["inst23153"])
1274 a52978c7 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_recreate_disks)
1275 a52978c7 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1276 a52978c7 Michael Hanselmann
1277 b82d4c5e Michael Hanselmann
  def testGetInstanceConsole(self):
1278 b82d4c5e Michael Hanselmann
    self.rapi.AddResponse("26876")
1279 b82d4c5e Michael Hanselmann
    job_id = self.client.GetInstanceConsole("inst21491")
1280 b82d4c5e Michael Hanselmann
    self.assertEqual(job_id, 26876)
1281 b82d4c5e Michael Hanselmann
    self.assertItems(["inst21491"])
1282 b82d4c5e Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_console)
1283 b82d4c5e Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1284 b82d4c5e Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
1285 b82d4c5e Michael Hanselmann
1286 e23881ed Michael Hanselmann
  def testGrowInstanceDisk(self):
1287 e23881ed Michael Hanselmann
    for idx, wait_for_sync in enumerate([None, False, True]):
1288 e23881ed Michael Hanselmann
      amount = 128 + (512 * idx)
1289 e23881ed Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1290 e23881ed Michael Hanselmann
      self.rapi.AddResponse("30783")
1291 e23881ed Michael Hanselmann
      self.assertEqual(30783,
1292 e23881ed Michael Hanselmann
        self.client.GrowInstanceDisk("eze8ch", idx, amount,
1293 e23881ed Michael Hanselmann
                                     wait_for_sync=wait_for_sync))
1294 e23881ed Michael Hanselmann
      self.assertHandler(rlib2.R_2_instances_name_disk_grow)
1295 e23881ed Michael Hanselmann
      self.assertItems(["eze8ch", str(idx)])
1296 e23881ed Michael Hanselmann
      data = serializer.LoadJson(self.rapi.GetLastRequestData())
1297 e23881ed Michael Hanselmann
      if wait_for_sync is None:
1298 e23881ed Michael Hanselmann
        self.assertEqual(len(data), 1)
1299 e23881ed Michael Hanselmann
        self.assert_("wait_for_sync" not in data)
1300 e23881ed Michael Hanselmann
      else:
1301 e23881ed Michael Hanselmann
        self.assertEqual(len(data), 2)
1302 e23881ed Michael Hanselmann
        self.assertEqual(data["wait_for_sync"], wait_for_sync)
1303 e23881ed Michael Hanselmann
      self.assertEqual(data["amount"], amount)
1304 e23881ed Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1305 e23881ed Michael Hanselmann
1306 414ebaf1 Michael Hanselmann
  def testGetGroupTags(self):
1307 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("[]")
1308 414ebaf1 Michael Hanselmann
    self.assertEqual([], self.client.GetGroupTags("fooGroup"))
1309 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1310 414ebaf1 Michael Hanselmann
    self.assertItems(["fooGroup"])
1311 414ebaf1 Michael Hanselmann
1312 414ebaf1 Michael Hanselmann
  def testAddGroupTags(self):
1313 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("1234")
1314 414ebaf1 Michael Hanselmann
    self.assertEqual(1234,
1315 414ebaf1 Michael Hanselmann
        self.client.AddGroupTags("fooGroup", ["awesome"], dry_run=True))
1316 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1317 414ebaf1 Michael Hanselmann
    self.assertItems(["fooGroup"])
1318 414ebaf1 Michael Hanselmann
    self.assertDryRun()
1319 414ebaf1 Michael Hanselmann
    self.assertQuery("tag", ["awesome"])
1320 414ebaf1 Michael Hanselmann
1321 414ebaf1 Michael Hanselmann
  def testDeleteGroupTags(self):
1322 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("25826")
1323 414ebaf1 Michael Hanselmann
    self.assertEqual(25826, self.client.DeleteGroupTags("foo", ["awesome"],
1324 414ebaf1 Michael Hanselmann
                                                        dry_run=True))
1325 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1326 414ebaf1 Michael Hanselmann
    self.assertItems(["foo"])
1327 414ebaf1 Michael Hanselmann
    self.assertDryRun()
1328 414ebaf1 Michael Hanselmann
    self.assertQuery("tag", ["awesome"])
1329 414ebaf1 Michael Hanselmann
1330 208a6cff Michael Hanselmann
  def testQuery(self):
1331 208a6cff Michael Hanselmann
    for idx, what in enumerate(constants.QR_VIA_RAPI):
1332 2e5c33db Iustin Pop
      for idx2, qfilter in enumerate([None, ["?", "name"]]):
1333 208a6cff Michael Hanselmann
        job_id = 11010 + (idx << 4) + (idx2 << 16)
1334 208a6cff Michael Hanselmann
        fields = sorted(query.ALL_FIELDS[what].keys())[:10]
1335 208a6cff Michael Hanselmann
1336 208a6cff Michael Hanselmann
        self.rapi.AddResponse(str(job_id))
1337 2e5c33db Iustin Pop
        self.assertEqual(self.client.Query(what, fields, qfilter=qfilter),
1338 208a6cff Michael Hanselmann
                         job_id)
1339 208a6cff Michael Hanselmann
        self.assertItems([what])
1340 208a6cff Michael Hanselmann
        self.assertHandler(rlib2.R_2_query)
1341 208a6cff Michael Hanselmann
        self.assertFalse(self.rapi.GetLastHandler().queryargs)
1342 208a6cff Michael Hanselmann
        data = serializer.LoadJson(self.rapi.GetLastRequestData())
1343 208a6cff Michael Hanselmann
        self.assertEqual(data["fields"], fields)
1344 2e5c33db Iustin Pop
        if qfilter is None:
1345 2e5c33db Iustin Pop
          self.assertTrue("qfilter" not in data)
1346 208a6cff Michael Hanselmann
        else:
1347 2e5c33db Iustin Pop
          self.assertEqual(data["qfilter"], qfilter)
1348 208a6cff Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1349 208a6cff Michael Hanselmann
1350 208a6cff Michael Hanselmann
  def testQueryFields(self):
1351 208a6cff Michael Hanselmann
    exp_result = objects.QueryFieldsResponse(fields=[
1352 208a6cff Michael Hanselmann
      objects.QueryFieldDefinition(name="pnode", title="PNode",
1353 208a6cff Michael Hanselmann
                                   kind=constants.QFT_NUMBER),
1354 208a6cff Michael Hanselmann
      objects.QueryFieldDefinition(name="other", title="Other",
1355 208a6cff Michael Hanselmann
                                   kind=constants.QFT_BOOL),
1356 208a6cff Michael Hanselmann
      ])
1357 208a6cff Michael Hanselmann
1358 208a6cff Michael Hanselmann
    for what in constants.QR_VIA_RAPI:
1359 208a6cff Michael Hanselmann
      for fields in [None, ["name", "_unknown_"], ["&", "?|"]]:
1360 208a6cff Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson(exp_result.ToDict()))
1361 208a6cff Michael Hanselmann
        result = self.client.QueryFields(what, fields=fields)
1362 208a6cff Michael Hanselmann
        self.assertItems([what])
1363 208a6cff Michael Hanselmann
        self.assertHandler(rlib2.R_2_query_fields)
1364 208a6cff Michael Hanselmann
        self.assertFalse(self.rapi.GetLastRequestData())
1365 208a6cff Michael Hanselmann
1366 208a6cff Michael Hanselmann
        queryargs = self.rapi.GetLastHandler().queryargs
1367 208a6cff Michael Hanselmann
        if fields is None:
1368 208a6cff Michael Hanselmann
          self.assertFalse(queryargs)
1369 208a6cff Michael Hanselmann
        else:
1370 208a6cff Michael Hanselmann
          self.assertEqual(queryargs, {
1371 208a6cff Michael Hanselmann
            "fields": [",".join(fields)],
1372 208a6cff Michael Hanselmann
            })
1373 208a6cff Michael Hanselmann
1374 208a6cff Michael Hanselmann
        self.assertEqual(objects.QueryFieldsResponse.FromDict(result).ToDict(),
1375 208a6cff Michael Hanselmann
                         exp_result.ToDict())
1376 208a6cff Michael Hanselmann
1377 208a6cff Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1378 208a6cff Michael Hanselmann
1379 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionNoChange(self):
1380 dde0e97c Michael Hanselmann
    resp = serializer.DumpJson({
1381 47099cd1 Michael Hanselmann
      "status": constants.JOB_STATUS_WAITING,
1382 dde0e97c Michael Hanselmann
      })
1383 dde0e97c Michael Hanselmann
1384 dde0e97c Michael Hanselmann
    for retries in [1, 5, 25]:
1385 dde0e97c Michael Hanselmann
      for _ in range(retries):
1386 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(resp)
1387 dde0e97c Michael Hanselmann
1388 dde0e97c Michael Hanselmann
      self.assertFalse(self.client.WaitForJobCompletion(22789, period=None,
1389 dde0e97c Michael Hanselmann
                                                        retries=retries))
1390 dde0e97c Michael Hanselmann
      self.assertHandler(rlib2.R_2_jobs_id)
1391 dde0e97c Michael Hanselmann
      self.assertItems(["22789"])
1392 dde0e97c Michael Hanselmann
1393 dde0e97c Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1394 dde0e97c Michael Hanselmann
1395 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionAlreadyFinished(self):
1396 dde0e97c Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson({
1397 dde0e97c Michael Hanselmann
      "status": constants.JOB_STATUS_SUCCESS,
1398 dde0e97c Michael Hanselmann
      }))
1399 dde0e97c Michael Hanselmann
1400 dde0e97c Michael Hanselmann
    self.assertTrue(self.client.WaitForJobCompletion(22793, period=None,
1401 dde0e97c Michael Hanselmann
                                                     retries=1))
1402 dde0e97c Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id)
1403 dde0e97c Michael Hanselmann
    self.assertItems(["22793"])
1404 dde0e97c Michael Hanselmann
1405 dde0e97c Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1406 dde0e97c Michael Hanselmann
1407 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionEmptyResponse(self):
1408 dde0e97c Michael Hanselmann
    self.rapi.AddResponse("{}")
1409 dde0e97c Michael Hanselmann
    self.assertFalse(self.client.WaitForJobCompletion(22793, period=None,
1410 dde0e97c Michael Hanselmann
                                                     retries=10))
1411 dde0e97c Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id)
1412 dde0e97c Michael Hanselmann
    self.assertItems(["22793"])
1413 dde0e97c Michael Hanselmann
1414 dde0e97c Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1415 dde0e97c Michael Hanselmann
1416 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionOutOfRetries(self):
1417 dde0e97c Michael Hanselmann
    for retries in [3, 10, 21]:
1418 dde0e97c Michael Hanselmann
      for _ in range(retries):
1419 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson({
1420 dde0e97c Michael Hanselmann
          "status": constants.JOB_STATUS_RUNNING,
1421 dde0e97c Michael Hanselmann
          }))
1422 dde0e97c Michael Hanselmann
1423 dde0e97c Michael Hanselmann
      self.assertFalse(self.client.WaitForJobCompletion(30948, period=None,
1424 dde0e97c Michael Hanselmann
                                                        retries=retries - 1))
1425 dde0e97c Michael Hanselmann
      self.assertHandler(rlib2.R_2_jobs_id)
1426 dde0e97c Michael Hanselmann
      self.assertItems(["30948"])
1427 dde0e97c Michael Hanselmann
1428 dde0e97c Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 1)
1429 dde0e97c Michael Hanselmann
      self.rapi.ResetResponses()
1430 dde0e97c Michael Hanselmann
1431 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionSuccessAndFailure(self):
1432 dde0e97c Michael Hanselmann
    for retries in [1, 4, 13]:
1433 dde0e97c Michael Hanselmann
      for (success, end_status) in [(False, constants.JOB_STATUS_ERROR),
1434 dde0e97c Michael Hanselmann
                                    (True, constants.JOB_STATUS_SUCCESS)]:
1435 dde0e97c Michael Hanselmann
        for _ in range(retries):
1436 dde0e97c Michael Hanselmann
          self.rapi.AddResponse(serializer.DumpJson({
1437 dde0e97c Michael Hanselmann
            "status": constants.JOB_STATUS_RUNNING,
1438 dde0e97c Michael Hanselmann
            }))
1439 dde0e97c Michael Hanselmann
1440 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson({
1441 dde0e97c Michael Hanselmann
          "status": end_status,
1442 dde0e97c Michael Hanselmann
          }))
1443 dde0e97c Michael Hanselmann
1444 dde0e97c Michael Hanselmann
        result = self.client.WaitForJobCompletion(3187, period=None,
1445 dde0e97c Michael Hanselmann
                                                  retries=retries + 1)
1446 dde0e97c Michael Hanselmann
        self.assertEqual(result, success)
1447 dde0e97c Michael Hanselmann
        self.assertHandler(rlib2.R_2_jobs_id)
1448 dde0e97c Michael Hanselmann
        self.assertItems(["3187"])
1449 dde0e97c Michael Hanselmann
1450 dde0e97c Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1451 dde0e97c Michael Hanselmann
1452 95ab4de9 David Knowles
1453 70b0d2a2 Michael Hanselmann
class RapiTestRunner(unittest.TextTestRunner):
1454 70b0d2a2 Michael Hanselmann
  def run(self, *args):
1455 70b0d2a2 Michael Hanselmann
    global _used_handlers
1456 70b0d2a2 Michael Hanselmann
    assert _used_handlers is None
1457 70b0d2a2 Michael Hanselmann
1458 70b0d2a2 Michael Hanselmann
    _used_handlers = set()
1459 70b0d2a2 Michael Hanselmann
    try:
1460 70b0d2a2 Michael Hanselmann
      # Run actual tests
1461 70b0d2a2 Michael Hanselmann
      result = unittest.TextTestRunner.run(self, *args)
1462 70b0d2a2 Michael Hanselmann
1463 70b0d2a2 Michael Hanselmann
      diff = (set(connector.CONNECTOR.values()) - _used_handlers -
1464 70b0d2a2 Michael Hanselmann
             _KNOWN_UNUSED)
1465 70b0d2a2 Michael Hanselmann
      if diff:
1466 70b0d2a2 Michael Hanselmann
        raise AssertionError("The following RAPI resources were not used by the"
1467 70b0d2a2 Michael Hanselmann
                             " RAPI client: %r" % utils.CommaJoin(diff))
1468 70b0d2a2 Michael Hanselmann
    finally:
1469 70b0d2a2 Michael Hanselmann
      # Reset global variable
1470 70b0d2a2 Michael Hanselmann
      _used_handlers = None
1471 70b0d2a2 Michael Hanselmann
1472 70b0d2a2 Michael Hanselmann
    return result
1473 70b0d2a2 Michael Hanselmann
1474 70b0d2a2 Michael Hanselmann
1475 2f96c43c Michael Hanselmann
if __name__ == "__main__":
1476 70b0d2a2 Michael Hanselmann
  client.UsesRapiClient(testutils.GanetiTestProgram)(testRunner=RapiTestRunner)