Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (56.9 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 55cec070 Michele Tartara
                                        ignore_secondaries=True, dry_run=True,
598 55cec070 Michele Tartara
                                        reason="Updates")
599 4a90bd4f Michele Tartara
    self.assertEqual(6146, job_id)
600 4a90bd4f Michele Tartara
    self.assertHandler(rlib2.R_2_instances_name_reboot)
601 4a90bd4f Michele Tartara
    self.assertItems(["i-bar"])
602 4a90bd4f Michele Tartara
    self.assertDryRun()
603 4a90bd4f Michele Tartara
    self.assertQuery("type", ["hard"])
604 4a90bd4f Michele Tartara
    self.assertQuery("ignore_secondaries", ["1"])
605 55cec070 Michele Tartara
    self.assertQuery("reason", ["Updates"])
606 4a90bd4f Michele Tartara
607 4a90bd4f Michele Tartara
  def testRebootInstanceDefaultReason(self):
608 4a90bd4f Michele Tartara
    self.rapi.AddResponse("6146")
609 4a90bd4f Michele Tartara
    job_id = self.client.RebootInstance("i-bar", reboot_type="hard",
610 cd577680 Michael Hanselmann
                                        ignore_secondaries=True, dry_run=True)
611 cd577680 Michael Hanselmann
    self.assertEqual(6146, job_id)
612 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reboot)
613 95ab4de9 David Knowles
    self.assertItems(["i-bar"])
614 95ab4de9 David Knowles
    self.assertDryRun()
615 95ab4de9 David Knowles
    self.assertQuery("type", ["hard"])
616 10f5ab6c Michael Hanselmann
    self.assertQuery("ignore_secondaries", ["1"])
617 55cec070 Michele Tartara
    self.assertQuery("reason", None)
618 95ab4de9 David Knowles
619 95ab4de9 David Knowles
  def testShutdownInstance(self):
620 cd577680 Michael Hanselmann
    self.rapi.AddResponse("1487")
621 cd577680 Michael Hanselmann
    self.assertEqual(1487, self.client.ShutdownInstance("foo-instance",
622 1f350e0f Michele Tartara
                                                        dry_run=True,
623 1f350e0f Michele Tartara
                                                        reason="NoMore"))
624 1f350e0f Michele Tartara
    self.assertHandler(rlib2.R_2_instances_name_shutdown)
625 1f350e0f Michele Tartara
    self.assertItems(["foo-instance"])
626 1f350e0f Michele Tartara
    self.assertDryRun()
627 1f350e0f Michele Tartara
    self.assertQuery("reason", ["NoMore"])
628 1f350e0f Michele Tartara
629 1f350e0f Michele Tartara
  def testShutdownInstanceDefaultReason(self):
630 1f350e0f Michele Tartara
    self.rapi.AddResponse("1487")
631 1f350e0f Michele Tartara
    self.assertEqual(1487, self.client.ShutdownInstance("foo-instance",
632 cd577680 Michael Hanselmann
                                                        dry_run=True))
633 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_shutdown)
634 95ab4de9 David Knowles
    self.assertItems(["foo-instance"])
635 95ab4de9 David Knowles
    self.assertDryRun()
636 1f350e0f Michele Tartara
    self.assertQuery("reason", None)
637 95ab4de9 David Knowles
638 95ab4de9 David Knowles
  def testStartupInstance(self):
639 cd577680 Michael Hanselmann
    self.rapi.AddResponse("27149")
640 cd577680 Michael Hanselmann
    self.assertEqual(27149, self.client.StartupInstance("bar-instance",
641 cd577680 Michael Hanselmann
                                                        dry_run=True))
642 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_startup)
643 95ab4de9 David Knowles
    self.assertItems(["bar-instance"])
644 95ab4de9 David Knowles
    self.assertDryRun()
645 95ab4de9 David Knowles
646 95ab4de9 David Knowles
  def testReinstallInstance(self):
647 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
648 cd577680 Michael Hanselmann
    self.rapi.AddResponse("19119")
649 fcee9675 David Knowles
    self.assertEqual(19119, self.client.ReinstallInstance("baz-instance",
650 fcee9675 David Knowles
                                                          os="DOS",
651 cd577680 Michael Hanselmann
                                                          no_startup=True))
652 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
653 95ab4de9 David Knowles
    self.assertItems(["baz-instance"])
654 95ab4de9 David Knowles
    self.assertQuery("os", ["DOS"])
655 95ab4de9 David Knowles
    self.assertQuery("nostartup", ["1"])
656 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
657 c744425f Michael Hanselmann
658 c744425f Michael Hanselmann
  def testReinstallInstanceNew(self):
659 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_REINSTALL_REQV1]))
660 c744425f Michael Hanselmann
    self.rapi.AddResponse("25689")
661 c744425f Michael Hanselmann
    self.assertEqual(25689, self.client.ReinstallInstance("moo-instance",
662 c744425f Michael Hanselmann
                                                          os="Debian",
663 c744425f Michael Hanselmann
                                                          no_startup=True))
664 c744425f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
665 c744425f Michael Hanselmann
    self.assertItems(["moo-instance"])
666 c744425f Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
667 c744425f Michael Hanselmann
    self.assertEqual(len(data), 2)
668 c744425f Michael Hanselmann
    self.assertEqual(data["os"], "Debian")
669 c744425f Michael Hanselmann
    self.assertEqual(data["start"], False)
670 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
671 c744425f Michael Hanselmann
672 c744425f Michael Hanselmann
  def testReinstallInstanceWithOsparams1(self):
673 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
674 c744425f Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.ReinstallInstance,
675 c744425f Michael Hanselmann
                      "doo-instance", osparams={"x": "y"})
676 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
677 c744425f Michael Hanselmann
678 c744425f Michael Hanselmann
  def testReinstallInstanceWithOsparams2(self):
679 c744425f Michael Hanselmann
    osparams = {
680 c744425f Michael Hanselmann
      "Hello": "World",
681 c744425f Michael Hanselmann
      "foo": "bar",
682 c744425f Michael Hanselmann
      }
683 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_REINSTALL_REQV1]))
684 c744425f Michael Hanselmann
    self.rapi.AddResponse("1717")
685 c744425f Michael Hanselmann
    self.assertEqual(1717, self.client.ReinstallInstance("zoo-instance",
686 c744425f Michael Hanselmann
                                                         osparams=osparams))
687 c744425f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
688 c744425f Michael Hanselmann
    self.assertItems(["zoo-instance"])
689 c744425f Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
690 c744425f Michael Hanselmann
    self.assertEqual(len(data), 2)
691 c744425f Michael Hanselmann
    self.assertEqual(data["osparams"], osparams)
692 c744425f Michael Hanselmann
    self.assertEqual(data["start"], True)
693 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
694 95ab4de9 David Knowles
695 95ab4de9 David Knowles
  def testReplaceInstanceDisks(self):
696 95ab4de9 David Knowles
    self.rapi.AddResponse("999")
697 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-name",
698 539d65ba Michael Hanselmann
        disks=[0, 1], iallocator="hail")
699 95ab4de9 David Knowles
    self.assertEqual(999, job_id)
700 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_replace_disks)
701 95ab4de9 David Knowles
    self.assertItems(["instance-name"])
702 bfc2002f Michael Hanselmann
    self.assertQuery("disks", ["0,1"])
703 95ab4de9 David Knowles
    self.assertQuery("mode", ["replace_auto"])
704 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
705 95ab4de9 David Knowles
706 95ab4de9 David Knowles
    self.rapi.AddResponse("1000")
707 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-bar",
708 539d65ba Michael Hanselmann
        disks=[1], mode="replace_on_secondary", remote_node="foo-node")
709 95ab4de9 David Knowles
    self.assertEqual(1000, job_id)
710 95ab4de9 David Knowles
    self.assertItems(["instance-bar"])
711 bfc2002f Michael Hanselmann
    self.assertQuery("disks", ["1"])
712 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["foo-node"])
713 95ab4de9 David Knowles
714 bfc2002f Michael Hanselmann
    self.rapi.AddResponse("5175")
715 bfc2002f Michael Hanselmann
    self.assertEqual(5175, self.client.ReplaceInstanceDisks("instance-moo"))
716 bfc2002f Michael Hanselmann
    self.assertItems(["instance-moo"])
717 bfc2002f Michael Hanselmann
    self.assertQuery("disks", None)
718 bfc2002f Michael Hanselmann
719 ebeb600f Michael Hanselmann
  def testPrepareExport(self):
720 ebeb600f Michael Hanselmann
    self.rapi.AddResponse("8326")
721 ebeb600f Michael Hanselmann
    self.assertEqual(8326, self.client.PrepareExport("inst1", "local"))
722 ebeb600f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_prepare_export)
723 ebeb600f Michael Hanselmann
    self.assertItems(["inst1"])
724 ebeb600f Michael Hanselmann
    self.assertQuery("mode", ["local"])
725 ebeb600f Michael Hanselmann
726 ebeb600f Michael Hanselmann
  def testExportInstance(self):
727 ebeb600f Michael Hanselmann
    self.rapi.AddResponse("19695")
728 ebeb600f Michael Hanselmann
    job_id = self.client.ExportInstance("inst2", "local", "nodeX",
729 ebeb600f Michael Hanselmann
                                        shutdown=True)
730 ebeb600f Michael Hanselmann
    self.assertEqual(job_id, 19695)
731 ebeb600f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_export)
732 ebeb600f Michael Hanselmann
    self.assertItems(["inst2"])
733 ebeb600f Michael Hanselmann
734 2a7c3583 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
735 ebeb600f Michael Hanselmann
    self.assertEqual(data["mode"], "local")
736 ebeb600f Michael Hanselmann
    self.assertEqual(data["destination"], "nodeX")
737 ebeb600f Michael Hanselmann
    self.assertEqual(data["shutdown"], True)
738 ebeb600f Michael Hanselmann
739 e0ac6ce6 Michael Hanselmann
  def testMigrateInstanceDefaults(self):
740 e0ac6ce6 Michael Hanselmann
    self.rapi.AddResponse("24873")
741 e0ac6ce6 Michael Hanselmann
    job_id = self.client.MigrateInstance("inst91")
742 e0ac6ce6 Michael Hanselmann
    self.assertEqual(job_id, 24873)
743 e0ac6ce6 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_migrate)
744 e0ac6ce6 Michael Hanselmann
    self.assertItems(["inst91"])
745 e0ac6ce6 Michael Hanselmann
746 e0ac6ce6 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
747 e0ac6ce6 Michael Hanselmann
    self.assertFalse(data)
748 e0ac6ce6 Michael Hanselmann
749 e0ac6ce6 Michael Hanselmann
  def testMigrateInstance(self):
750 e0ac6ce6 Michael Hanselmann
    for mode in constants.HT_MIGRATION_MODES:
751 e0ac6ce6 Michael Hanselmann
      for cleanup in [False, True]:
752 e0ac6ce6 Michael Hanselmann
        self.rapi.AddResponse("31910")
753 e0ac6ce6 Michael Hanselmann
        job_id = self.client.MigrateInstance("inst289", mode=mode,
754 e0ac6ce6 Michael Hanselmann
                                             cleanup=cleanup)
755 e0ac6ce6 Michael Hanselmann
        self.assertEqual(job_id, 31910)
756 e0ac6ce6 Michael Hanselmann
        self.assertHandler(rlib2.R_2_instances_name_migrate)
757 e0ac6ce6 Michael Hanselmann
        self.assertItems(["inst289"])
758 e0ac6ce6 Michael Hanselmann
759 e0ac6ce6 Michael Hanselmann
        data = serializer.LoadJson(self.rapi.GetLastRequestData())
760 e0ac6ce6 Michael Hanselmann
        self.assertEqual(len(data), 2)
761 e0ac6ce6 Michael Hanselmann
        self.assertEqual(data["mode"], mode)
762 e0ac6ce6 Michael Hanselmann
        self.assertEqual(data["cleanup"], cleanup)
763 e0ac6ce6 Michael Hanselmann
764 c0a146a1 Michael Hanselmann
  def testFailoverInstanceDefaults(self):
765 c0a146a1 Michael Hanselmann
    self.rapi.AddResponse("7639")
766 c0a146a1 Michael Hanselmann
    job_id = self.client.FailoverInstance("inst13579")
767 c0a146a1 Michael Hanselmann
    self.assertEqual(job_id, 7639)
768 c0a146a1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_failover)
769 c0a146a1 Michael Hanselmann
    self.assertItems(["inst13579"])
770 c0a146a1 Michael Hanselmann
771 c0a146a1 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
772 c0a146a1 Michael Hanselmann
    self.assertFalse(data)
773 c0a146a1 Michael Hanselmann
774 c0a146a1 Michael Hanselmann
  def testFailoverInstance(self):
775 c0a146a1 Michael Hanselmann
    for iallocator in ["dumb", "hail"]:
776 c0a146a1 Michael Hanselmann
      for ignore_consistency in [False, True]:
777 c0a146a1 Michael Hanselmann
        for target_node in ["node-a", "node2"]:
778 c0a146a1 Michael Hanselmann
          self.rapi.AddResponse("19161")
779 c0a146a1 Michael Hanselmann
          job_id = \
780 c0a146a1 Michael Hanselmann
            self.client.FailoverInstance("inst251", iallocator=iallocator,
781 c0a146a1 Michael Hanselmann
                                         ignore_consistency=ignore_consistency,
782 c0a146a1 Michael Hanselmann
                                         target_node=target_node)
783 c0a146a1 Michael Hanselmann
          self.assertEqual(job_id, 19161)
784 c0a146a1 Michael Hanselmann
          self.assertHandler(rlib2.R_2_instances_name_failover)
785 c0a146a1 Michael Hanselmann
          self.assertItems(["inst251"])
786 c0a146a1 Michael Hanselmann
787 c0a146a1 Michael Hanselmann
          data = serializer.LoadJson(self.rapi.GetLastRequestData())
788 c0a146a1 Michael Hanselmann
          self.assertEqual(len(data), 3)
789 c0a146a1 Michael Hanselmann
          self.assertEqual(data["iallocator"], iallocator)
790 c0a146a1 Michael Hanselmann
          self.assertEqual(data["ignore_consistency"], ignore_consistency)
791 c0a146a1 Michael Hanselmann
          self.assertEqual(data["target_node"], target_node)
792 c0a146a1 Michael Hanselmann
          self.assertEqual(self.rapi.CountPending(), 0)
793 c0a146a1 Michael Hanselmann
794 d654aae1 Michael Hanselmann
  def testRenameInstanceDefaults(self):
795 d654aae1 Michael Hanselmann
    new_name = "newnametha7euqu"
796 d654aae1 Michael Hanselmann
    self.rapi.AddResponse("8791")
797 d654aae1 Michael Hanselmann
    job_id = self.client.RenameInstance("inst18821", new_name)
798 d654aae1 Michael Hanselmann
    self.assertEqual(job_id, 8791)
799 d654aae1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_rename)
800 d654aae1 Michael Hanselmann
    self.assertItems(["inst18821"])
801 d654aae1 Michael Hanselmann
802 d654aae1 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
803 d654aae1 Michael Hanselmann
    self.assertEqualValues(data, {"new_name": new_name, })
804 d654aae1 Michael Hanselmann
805 d654aae1 Michael Hanselmann
  def testRenameInstance(self):
806 d654aae1 Michael Hanselmann
    new_name = "new-name-yiux1iin"
807 d654aae1 Michael Hanselmann
    for ip_check in [False, True]:
808 d654aae1 Michael Hanselmann
      for name_check in [False, True]:
809 d654aae1 Michael Hanselmann
        self.rapi.AddResponse("24776")
810 d654aae1 Michael Hanselmann
        job_id = self.client.RenameInstance("inst20967", new_name,
811 d654aae1 Michael Hanselmann
                                             ip_check=ip_check,
812 d654aae1 Michael Hanselmann
                                             name_check=name_check)
813 d654aae1 Michael Hanselmann
        self.assertEqual(job_id, 24776)
814 d654aae1 Michael Hanselmann
        self.assertHandler(rlib2.R_2_instances_name_rename)
815 d654aae1 Michael Hanselmann
        self.assertItems(["inst20967"])
816 d654aae1 Michael Hanselmann
817 d654aae1 Michael Hanselmann
        data = serializer.LoadJson(self.rapi.GetLastRequestData())
818 d654aae1 Michael Hanselmann
        self.assertEqual(len(data), 3)
819 d654aae1 Michael Hanselmann
        self.assertEqual(data["new_name"], new_name)
820 d654aae1 Michael Hanselmann
        self.assertEqual(data["ip_check"], ip_check)
821 d654aae1 Michael Hanselmann
        self.assertEqual(data["name_check"], name_check)
822 d654aae1 Michael Hanselmann
823 95ab4de9 David Knowles
  def testGetJobs(self):
824 2004e673 Iustin Pop
    self.rapi.AddResponse('[ { "id": "123", "uri": "\\/2\\/jobs\\/123" },'
825 2004e673 Iustin Pop
                          '  { "id": "124", "uri": "\\/2\\/jobs\\/124" } ]')
826 95ab4de9 David Knowles
    self.assertEqual([123, 124], self.client.GetJobs())
827 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs)
828 95ab4de9 David Knowles
829 95ab4de9 David Knowles
  def testGetJobStatus(self):
830 95ab4de9 David Knowles
    self.rapi.AddResponse("{\"foo\": \"bar\"}")
831 95ab4de9 David Knowles
    self.assertEqual({"foo": "bar"}, self.client.GetJobStatus(1234))
832 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
833 95ab4de9 David Knowles
    self.assertItems(["1234"])
834 95ab4de9 David Knowles
835 d9b67f70 Michael Hanselmann
  def testWaitForJobChange(self):
836 d9b67f70 Michael Hanselmann
    fields = ["id", "summary"]
837 d9b67f70 Michael Hanselmann
    expected = {
838 d9b67f70 Michael Hanselmann
      "job_info": [123, "something"],
839 d9b67f70 Michael Hanselmann
      "log_entries": [],
840 d9b67f70 Michael Hanselmann
      }
841 d9b67f70 Michael Hanselmann
842 d9b67f70 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson(expected))
843 d9b67f70 Michael Hanselmann
    result = self.client.WaitForJobChange(123, fields, [], -1)
844 d9b67f70 Michael Hanselmann
    self.assertEqualValues(expected, result)
845 d9b67f70 Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id_wait)
846 d9b67f70 Michael Hanselmann
    self.assertItems(["123"])
847 d9b67f70 Michael Hanselmann
848 cf9ada49 Michael Hanselmann
  def testCancelJob(self):
849 cd577680 Michael Hanselmann
    self.rapi.AddResponse("[true, \"Job 123 will be canceled\"]")
850 cd577680 Michael Hanselmann
    self.assertEqual([True, "Job 123 will be canceled"],
851 cf9ada49 Michael Hanselmann
                     self.client.CancelJob(999, dry_run=True))
852 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
853 95ab4de9 David Knowles
    self.assertItems(["999"])
854 95ab4de9 David Knowles
    self.assertDryRun()
855 95ab4de9 David Knowles
856 95ab4de9 David Knowles
  def testGetNodes(self):
857 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
858 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
859 95ab4de9 David Knowles
    self.assertEqual(["node1", "node2"], self.client.GetNodes())
860 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
861 95ab4de9 David Knowles
862 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
863 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
864 95ab4de9 David Knowles
    self.assertEqual([{"id": "node1", "uri": "uri1"},
865 95ab4de9 David Knowles
                      {"id": "node2", "uri": "uri2"}],
866 95ab4de9 David Knowles
                     self.client.GetNodes(bulk=True))
867 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
868 95ab4de9 David Knowles
    self.assertBulk()
869 95ab4de9 David Knowles
870 591e5103 Michael Hanselmann
  def testGetNode(self):
871 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
872 591e5103 Michael Hanselmann
    self.assertEqual({}, self.client.GetNode("node-foo"))
873 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name)
874 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
875 95ab4de9 David Knowles
876 95ab4de9 David Knowles
  def testEvacuateNode(self):
877 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_EVAC_RES1]))
878 95ab4de9 David Knowles
    self.rapi.AddResponse("9876")
879 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-1", remote_node="node-2")
880 95ab4de9 David Knowles
    self.assertEqual(9876, job_id)
881 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_evacuate)
882 95ab4de9 David Knowles
    self.assertItems(["node-1"])
883 de40437a Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
884 de40437a Michael Hanselmann
                     { "remote_node": "node-2", })
885 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
886 95ab4de9 David Knowles
887 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_EVAC_RES1]))
888 95ab4de9 David Knowles
    self.rapi.AddResponse("8888")
889 0b58db81 Michael Hanselmann
    job_id = self.client.EvacuateNode("node-3", iallocator="hail", dry_run=True,
890 cb92e7a1 Michael Hanselmann
                                      mode=constants.NODE_EVAC_ALL,
891 0b58db81 Michael Hanselmann
                                      early_release=True)
892 95ab4de9 David Knowles
    self.assertEqual(8888, job_id)
893 95ab4de9 David Knowles
    self.assertItems(["node-3"])
894 0b58db81 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()), {
895 0b58db81 Michael Hanselmann
      "iallocator": "hail",
896 0b58db81 Michael Hanselmann
      "mode": "all",
897 0b58db81 Michael Hanselmann
      "early_release": True,
898 0b58db81 Michael Hanselmann
      })
899 95ab4de9 David Knowles
    self.assertDryRun()
900 95ab4de9 David Knowles
901 95ab4de9 David Knowles
    self.assertRaises(client.GanetiApiError,
902 95ab4de9 David Knowles
                      self.client.EvacuateNode,
903 95ab4de9 David Knowles
                      "node-4", iallocator="hail", remote_node="node-5")
904 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
905 de40437a Michael Hanselmann
906 de40437a Michael Hanselmann
  def testEvacuateNodeOldResponse(self):
907 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
908 de40437a Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.EvacuateNode,
909 de40437a Michael Hanselmann
                      "node-4", accept_old=False)
910 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
911 de40437a Michael Hanselmann
912 0b58db81 Michael Hanselmann
    for mode in [client.NODE_EVAC_PRI, client.NODE_EVAC_ALL]:
913 0b58db81 Michael Hanselmann
      self.rapi.AddResponse(serializer.DumpJson([]))
914 0b58db81 Michael Hanselmann
      self.assertRaises(client.GanetiApiError, self.client.EvacuateNode,
915 0b58db81 Michael Hanselmann
                        "node-4", accept_old=True, mode=mode)
916 0b58db81 Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
917 de40437a Michael Hanselmann
918 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
919 0b58db81 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson("21533"))
920 0b58db81 Michael Hanselmann
    result = self.client.EvacuateNode("node-3", iallocator="hail",
921 0b58db81 Michael Hanselmann
                                      dry_run=True, accept_old=True,
922 0b58db81 Michael Hanselmann
                                      mode=client.NODE_EVAC_SEC,
923 0b58db81 Michael Hanselmann
                                      early_release=True)
924 0b58db81 Michael Hanselmann
    self.assertEqual(result, "21533")
925 0b58db81 Michael Hanselmann
    self.assertItems(["node-3"])
926 0b58db81 Michael Hanselmann
    self.assertQuery("iallocator", ["hail"])
927 0b58db81 Michael Hanselmann
    self.assertQuery("early_release", ["1"])
928 0b58db81 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
929 0b58db81 Michael Hanselmann
    self.assertDryRun()
930 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
931 de40437a Michael Hanselmann
932 95ab4de9 David Knowles
  def testMigrateNode(self):
933 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
934 95ab4de9 David Knowles
    self.rapi.AddResponse("1111")
935 95ab4de9 David Knowles
    self.assertEqual(1111, self.client.MigrateNode("node-a", dry_run=True))
936 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
937 95ab4de9 David Knowles
    self.assertItems(["node-a"])
938 1f334d96 Iustin Pop
    self.assert_("mode" not in self.rapi.GetLastHandler().queryargs)
939 1f334d96 Iustin Pop
    self.assertDryRun()
940 b7a1c816 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
941 1f334d96 Iustin Pop
942 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
943 1f334d96 Iustin Pop
    self.rapi.AddResponse("1112")
944 1f334d96 Iustin Pop
    self.assertEqual(1112, self.client.MigrateNode("node-a", dry_run=True,
945 1f334d96 Iustin Pop
                                                   mode="live"))
946 1f334d96 Iustin Pop
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
947 1f334d96 Iustin Pop
    self.assertItems(["node-a"])
948 1f334d96 Iustin Pop
    self.assertQuery("mode", ["live"])
949 95ab4de9 David Knowles
    self.assertDryRun()
950 b7a1c816 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
951 b7a1c816 Michael Hanselmann
952 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
953 b7a1c816 Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.MigrateNode,
954 b7a1c816 Michael Hanselmann
                      "node-c", target_node="foonode")
955 b7a1c816 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
956 b7a1c816 Michael Hanselmann
957 b7a1c816 Michael Hanselmann
  def testMigrateNodeBodyData(self):
958 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_MIGRATE_REQV1]))
959 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse("27539")
960 b7a1c816 Michael Hanselmann
    self.assertEqual(27539, self.client.MigrateNode("node-a", dry_run=False,
961 b7a1c816 Michael Hanselmann
                                                    mode="live"))
962 b7a1c816 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
963 b7a1c816 Michael Hanselmann
    self.assertItems(["node-a"])
964 b7a1c816 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
965 b7a1c816 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
966 b7a1c816 Michael Hanselmann
                     { "mode": "live", })
967 b7a1c816 Michael Hanselmann
968 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_MIGRATE_REQV1]))
969 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse("14219")
970 b7a1c816 Michael Hanselmann
    self.assertEqual(14219, self.client.MigrateNode("node-x", dry_run=True,
971 b7a1c816 Michael Hanselmann
                                                    target_node="node9",
972 b7a1c816 Michael Hanselmann
                                                    iallocator="ial"))
973 b7a1c816 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
974 b7a1c816 Michael Hanselmann
    self.assertItems(["node-x"])
975 b7a1c816 Michael Hanselmann
    self.assertDryRun()
976 b7a1c816 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
977 b7a1c816 Michael Hanselmann
                     { "target_node": "node9", "iallocator": "ial", })
978 b7a1c816 Michael Hanselmann
979 b7a1c816 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
980 95ab4de9 David Knowles
981 95ab4de9 David Knowles
  def testGetNodeRole(self):
982 95ab4de9 David Knowles
    self.rapi.AddResponse("\"master\"")
983 95ab4de9 David Knowles
    self.assertEqual("master", self.client.GetNodeRole("node-a"))
984 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
985 95ab4de9 David Knowles
    self.assertItems(["node-a"])
986 95ab4de9 David Knowles
987 95ab4de9 David Knowles
  def testSetNodeRole(self):
988 95ab4de9 David Knowles
    self.rapi.AddResponse("789")
989 95ab4de9 David Knowles
    self.assertEqual(789,
990 95ab4de9 David Knowles
        self.client.SetNodeRole("node-foo", "master-candidate", force=True))
991 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
992 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
993 10f5ab6c Michael Hanselmann
    self.assertQuery("force", ["1"])
994 2a7c3583 Michael Hanselmann
    self.assertEqual("\"master-candidate\"", self.rapi.GetLastRequestData())
995 95ab4de9 David Knowles
996 42d4d8b9 Michael Hanselmann
  def testPowercycleNode(self):
997 42d4d8b9 Michael Hanselmann
    self.rapi.AddResponse("23051")
998 42d4d8b9 Michael Hanselmann
    self.assertEqual(23051,
999 42d4d8b9 Michael Hanselmann
        self.client.PowercycleNode("node5468", force=True))
1000 42d4d8b9 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_powercycle)
1001 42d4d8b9 Michael Hanselmann
    self.assertItems(["node5468"])
1002 42d4d8b9 Michael Hanselmann
    self.assertQuery("force", ["1"])
1003 42d4d8b9 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
1004 42d4d8b9 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1005 42d4d8b9 Michael Hanselmann
1006 94497dd1 Michael Hanselmann
  def testModifyNode(self):
1007 94497dd1 Michael Hanselmann
    self.rapi.AddResponse("3783")
1008 94497dd1 Michael Hanselmann
    job_id = self.client.ModifyNode("node16979.example.com", drained=True)
1009 94497dd1 Michael Hanselmann
    self.assertEqual(job_id, 3783)
1010 94497dd1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_modify)
1011 94497dd1 Michael Hanselmann
    self.assertItems(["node16979.example.com"])
1012 94497dd1 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1013 94497dd1 Michael Hanselmann
1014 95ab4de9 David Knowles
  def testGetNodeStorageUnits(self):
1015 95ab4de9 David Knowles
    self.rapi.AddResponse("42")
1016 95ab4de9 David Knowles
    self.assertEqual(42,
1017 95ab4de9 David Knowles
        self.client.GetNodeStorageUnits("node-x", "lvm-pv", "fields"))
1018 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage)
1019 95ab4de9 David Knowles
    self.assertItems(["node-x"])
1020 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
1021 95ab4de9 David Knowles
    self.assertQuery("output_fields", ["fields"])
1022 95ab4de9 David Knowles
1023 95ab4de9 David Knowles
  def testModifyNodeStorageUnits(self):
1024 95ab4de9 David Knowles
    self.rapi.AddResponse("14")
1025 95ab4de9 David Knowles
    self.assertEqual(14,
1026 95ab4de9 David Knowles
        self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda"))
1027 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
1028 95ab4de9 David Knowles
    self.assertItems(["node-z"])
1029 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
1030 95ab4de9 David Knowles
    self.assertQuery("name", ["hda"])
1031 fde28316 Michael Hanselmann
    self.assertQuery("allocatable", None)
1032 fde28316 Michael Hanselmann
1033 fde28316 Michael Hanselmann
    for allocatable, query_allocatable in [(True, "1"), (False, "0")]:
1034 fde28316 Michael Hanselmann
      self.rapi.AddResponse("7205")
1035 fde28316 Michael Hanselmann
      job_id = self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda",
1036 fde28316 Michael Hanselmann
                                                  allocatable=allocatable)
1037 fde28316 Michael Hanselmann
      self.assertEqual(7205, job_id)
1038 fde28316 Michael Hanselmann
      self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
1039 fde28316 Michael Hanselmann
      self.assertItems(["node-z"])
1040 fde28316 Michael Hanselmann
      self.assertQuery("storage_type", ["lvm-pv"])
1041 fde28316 Michael Hanselmann
      self.assertQuery("name", ["hda"])
1042 fde28316 Michael Hanselmann
      self.assertQuery("allocatable", [query_allocatable])
1043 95ab4de9 David Knowles
1044 752df8bb Michael Hanselmann
  def testRepairNodeStorageUnits(self):
1045 752df8bb Michael Hanselmann
    self.rapi.AddResponse("99")
1046 752df8bb Michael Hanselmann
    self.assertEqual(99, self.client.RepairNodeStorageUnits("node-z", "lvm-pv",
1047 752df8bb Michael Hanselmann
                                                            "hda"))
1048 752df8bb Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_storage_repair)
1049 752df8bb Michael Hanselmann
    self.assertItems(["node-z"])
1050 752df8bb Michael Hanselmann
    self.assertQuery("storage_type", ["lvm-pv"])
1051 752df8bb Michael Hanselmann
    self.assertQuery("name", ["hda"])
1052 752df8bb Michael Hanselmann
1053 95ab4de9 David Knowles
  def testGetNodeTags(self):
1054 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"fry\", \"bender\"]")
1055 95ab4de9 David Knowles
    self.assertEqual(["fry", "bender"], self.client.GetNodeTags("node-k"))
1056 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1057 95ab4de9 David Knowles
    self.assertItems(["node-k"])
1058 95ab4de9 David Knowles
1059 95ab4de9 David Knowles
  def testAddNodeTags(self):
1060 cab667cc David Knowles
    self.rapi.AddResponse("1234")
1061 cab667cc David Knowles
    self.assertEqual(1234,
1062 cab667cc David Knowles
        self.client.AddNodeTags("node-v", ["awesome"], dry_run=True))
1063 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1064 95ab4de9 David Knowles
    self.assertItems(["node-v"])
1065 95ab4de9 David Knowles
    self.assertDryRun()
1066 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
1067 95ab4de9 David Knowles
1068 95ab4de9 David Knowles
  def testDeleteNodeTags(self):
1069 cd577680 Michael Hanselmann
    self.rapi.AddResponse("16861")
1070 cd577680 Michael Hanselmann
    self.assertEqual(16861, self.client.DeleteNodeTags("node-w", ["awesome"],
1071 cd577680 Michael Hanselmann
                                                       dry_run=True))
1072 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1073 95ab4de9 David Knowles
    self.assertItems(["node-w"])
1074 95ab4de9 David Knowles
    self.assertDryRun()
1075 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
1076 95ab4de9 David Knowles
1077 a268af8d Adeodato Simo
  def testGetGroups(self):
1078 a268af8d Adeodato Simo
    groups = [{"name": "group1",
1079 a268af8d Adeodato Simo
               "uri": "/2/groups/group1",
1080 a268af8d Adeodato Simo
               },
1081 a268af8d Adeodato Simo
              {"name": "group2",
1082 a268af8d Adeodato Simo
               "uri": "/2/groups/group2",
1083 a268af8d Adeodato Simo
               },
1084 a268af8d Adeodato Simo
              ]
1085 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(groups))
1086 a268af8d Adeodato Simo
    self.assertEqual(["group1", "group2"], self.client.GetGroups())
1087 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1088 a268af8d Adeodato Simo
1089 a268af8d Adeodato Simo
  def testGetGroupsBulk(self):
1090 a268af8d Adeodato Simo
    groups = [{"name": "group1",
1091 a268af8d Adeodato Simo
               "uri": "/2/groups/group1",
1092 a268af8d Adeodato Simo
               "node_cnt": 2,
1093 a268af8d Adeodato Simo
               "node_list": ["gnt1.test",
1094 a268af8d Adeodato Simo
                             "gnt2.test",
1095 a268af8d Adeodato Simo
                             ],
1096 a268af8d Adeodato Simo
               },
1097 a268af8d Adeodato Simo
              {"name": "group2",
1098 a268af8d Adeodato Simo
               "uri": "/2/groups/group2",
1099 a268af8d Adeodato Simo
               "node_cnt": 1,
1100 a268af8d Adeodato Simo
               "node_list": ["gnt3.test",
1101 a268af8d Adeodato Simo
                             ],
1102 a268af8d Adeodato Simo
               },
1103 a268af8d Adeodato Simo
              ]
1104 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(groups))
1105 a268af8d Adeodato Simo
1106 a268af8d Adeodato Simo
    self.assertEqual(groups, self.client.GetGroups(bulk=True))
1107 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1108 a268af8d Adeodato Simo
    self.assertBulk()
1109 a268af8d Adeodato Simo
1110 a268af8d Adeodato Simo
  def testGetGroup(self):
1111 a268af8d Adeodato Simo
    group = {"ctime": None,
1112 a268af8d Adeodato Simo
             "name": "default",
1113 a268af8d Adeodato Simo
             }
1114 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(group))
1115 a268af8d Adeodato Simo
    self.assertEqual({"ctime": None, "name": "default"},
1116 a268af8d Adeodato Simo
                     self.client.GetGroup("default"))
1117 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name)
1118 a268af8d Adeodato Simo
    self.assertItems(["default"])
1119 a268af8d Adeodato Simo
1120 a268af8d Adeodato Simo
  def testCreateGroup(self):
1121 a268af8d Adeodato Simo
    self.rapi.AddResponse("12345")
1122 a268af8d Adeodato Simo
    job_id = self.client.CreateGroup("newgroup", dry_run=True)
1123 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12345)
1124 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1125 a268af8d Adeodato Simo
    self.assertDryRun()
1126 a268af8d Adeodato Simo
1127 a268af8d Adeodato Simo
  def testDeleteGroup(self):
1128 a268af8d Adeodato Simo
    self.rapi.AddResponse("12346")
1129 a268af8d Adeodato Simo
    job_id = self.client.DeleteGroup("newgroup", dry_run=True)
1130 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12346)
1131 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name)
1132 a268af8d Adeodato Simo
    self.assertDryRun()
1133 a268af8d Adeodato Simo
1134 a268af8d Adeodato Simo
  def testRenameGroup(self):
1135 a268af8d Adeodato Simo
    self.rapi.AddResponse("12347")
1136 a268af8d Adeodato Simo
    job_id = self.client.RenameGroup("oldname", "newname")
1137 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12347)
1138 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_rename)
1139 a268af8d Adeodato Simo
1140 7187e6ff Adeodato Simo
  def testModifyGroup(self):
1141 7187e6ff Adeodato Simo
    self.rapi.AddResponse("12348")
1142 7187e6ff Adeodato Simo
    job_id = self.client.ModifyGroup("mygroup", alloc_policy="foo")
1143 7187e6ff Adeodato Simo
    self.assertEqual(job_id, 12348)
1144 7187e6ff Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_modify)
1145 7187e6ff Adeodato Simo
1146 4245446f Adeodato Simo
  def testAssignGroupNodes(self):
1147 4245446f Adeodato Simo
    self.rapi.AddResponse("12349")
1148 4245446f Adeodato Simo
    job_id = self.client.AssignGroupNodes("mygroup", ["node1", "node2"],
1149 4245446f Adeodato Simo
                                          force=True, dry_run=True)
1150 4245446f Adeodato Simo
    self.assertEqual(job_id, 12349)
1151 4245446f Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_assign_nodes)
1152 4245446f Adeodato Simo
    self.assertDryRun()
1153 4245446f Adeodato Simo
    self.assertUseForce()
1154 4245446f Adeodato Simo
1155 6e8091f9 Dimitris Aragiorgis
  def testGetNetworksBulk(self):
1156 6e8091f9 Dimitris Aragiorgis
    networks = [{"name": "network1",
1157 6e8091f9 Dimitris Aragiorgis
               "uri": "/2/networks/network1",
1158 6e8091f9 Dimitris Aragiorgis
               "network": "192.168.0.0/24",
1159 6e8091f9 Dimitris Aragiorgis
               },
1160 6e8091f9 Dimitris Aragiorgis
              {"name": "network2",
1161 6e8091f9 Dimitris Aragiorgis
               "uri": "/2/networks/network2",
1162 6e8091f9 Dimitris Aragiorgis
               "network": "192.168.0.0/24",
1163 6e8091f9 Dimitris Aragiorgis
               },
1164 6e8091f9 Dimitris Aragiorgis
              ]
1165 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse(serializer.DumpJson(networks))
1166 6e8091f9 Dimitris Aragiorgis
1167 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(networks, self.client.GetNetworks(bulk=True))
1168 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks)
1169 6e8091f9 Dimitris Aragiorgis
    self.assertBulk()
1170 6e8091f9 Dimitris Aragiorgis
1171 6e8091f9 Dimitris Aragiorgis
  def testGetNetwork(self):
1172 6e8091f9 Dimitris Aragiorgis
    network = {"ctime": None,
1173 6e8091f9 Dimitris Aragiorgis
               "name": "network1",
1174 6e8091f9 Dimitris Aragiorgis
               }
1175 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse(serializer.DumpJson(network))
1176 6e8091f9 Dimitris Aragiorgis
    self.assertEqual({"ctime": None, "name": "network1"},
1177 6e8091f9 Dimitris Aragiorgis
                     self.client.GetNetwork("network1"))
1178 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name)
1179 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["network1"])
1180 6e8091f9 Dimitris Aragiorgis
1181 6e8091f9 Dimitris Aragiorgis
  def testCreateNetwork(self):
1182 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12345")
1183 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.CreateNetwork("newnetwork", network="192.168.0.0/24",
1184 6e8091f9 Dimitris Aragiorgis
                                       dry_run=True)
1185 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12345)
1186 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks)
1187 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1188 6e8091f9 Dimitris Aragiorgis
1189 6e8091f9 Dimitris Aragiorgis
  def testModifyNetwork(self):
1190 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12346")
1191 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.ModifyNetwork("mynetwork", gateway="192.168.0.10",
1192 6e8091f9 Dimitris Aragiorgis
                                     dry_run=True)
1193 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12346)
1194 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_modify)
1195 6e8091f9 Dimitris Aragiorgis
1196 6e8091f9 Dimitris Aragiorgis
  def testDeleteNetwork(self):
1197 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12347")
1198 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.DeleteNetwork("newnetwork", dry_run=True)
1199 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12347)
1200 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name)
1201 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1202 6e8091f9 Dimitris Aragiorgis
1203 6e8091f9 Dimitris Aragiorgis
  def testConnectNetwork(self):
1204 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12348")
1205 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.ConnectNetwork("mynetwork", "default",
1206 6e8091f9 Dimitris Aragiorgis
                                        "bridged", "br0", dry_run=True)
1207 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12348)
1208 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_connect)
1209 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1210 6e8091f9 Dimitris Aragiorgis
1211 6e8091f9 Dimitris Aragiorgis
  def testDisconnectNetwork(self):
1212 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12349")
1213 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.DisconnectNetwork("mynetwork", "default", dry_run=True)
1214 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12349)
1215 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_disconnect)
1216 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1217 6e8091f9 Dimitris Aragiorgis
1218 6e8091f9 Dimitris Aragiorgis
  def testGetNetworkTags(self):
1219 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("[]")
1220 6e8091f9 Dimitris Aragiorgis
    self.assertEqual([], self.client.GetNetworkTags("fooNetwork"))
1221 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_tags)
1222 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["fooNetwork"])
1223 6e8091f9 Dimitris Aragiorgis
1224 6e8091f9 Dimitris Aragiorgis
  def testAddNetworkTags(self):
1225 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("1234")
1226 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(1234,
1227 6e8091f9 Dimitris Aragiorgis
        self.client.AddNetworkTags("fooNetwork", ["awesome"], dry_run=True))
1228 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_tags)
1229 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["fooNetwork"])
1230 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1231 6e8091f9 Dimitris Aragiorgis
    self.assertQuery("tag", ["awesome"])
1232 6e8091f9 Dimitris Aragiorgis
1233 6e8091f9 Dimitris Aragiorgis
  def testDeleteNetworkTags(self):
1234 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("25826")
1235 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(25826, self.client.DeleteNetworkTags("foo", ["awesome"],
1236 6e8091f9 Dimitris Aragiorgis
                                                          dry_run=True))
1237 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_tags)
1238 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["foo"])
1239 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1240 6e8091f9 Dimitris Aragiorgis
    self.assertQuery("tag", ["awesome"])
1241 6e8091f9 Dimitris Aragiorgis
1242 08c11c40 Michael Hanselmann
  def testModifyInstance(self):
1243 08c11c40 Michael Hanselmann
    self.rapi.AddResponse("23681")
1244 08c11c40 Michael Hanselmann
    job_id = self.client.ModifyInstance("inst7210", os_name="linux")
1245 08c11c40 Michael Hanselmann
    self.assertEqual(job_id, 23681)
1246 08c11c40 Michael Hanselmann
    self.assertItems(["inst7210"])
1247 08c11c40 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_modify)
1248 08c11c40 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
1249 08c11c40 Michael Hanselmann
                     { "os_name": "linux", })
1250 08c11c40 Michael Hanselmann
1251 62e999a5 Michael Hanselmann
  def testModifyCluster(self):
1252 62e999a5 Michael Hanselmann
    for mnh in [None, False, True]:
1253 62e999a5 Michael Hanselmann
      self.rapi.AddResponse("14470")
1254 62e999a5 Michael Hanselmann
      self.assertEqual(14470,
1255 62e999a5 Michael Hanselmann
        self.client.ModifyCluster(maintain_node_health=mnh))
1256 62e999a5 Michael Hanselmann
      self.assertHandler(rlib2.R_2_cluster_modify)
1257 62e999a5 Michael Hanselmann
      self.assertItems([])
1258 62e999a5 Michael Hanselmann
      data = serializer.LoadJson(self.rapi.GetLastRequestData())
1259 62e999a5 Michael Hanselmann
      self.assertEqual(len(data), 1)
1260 62e999a5 Michael Hanselmann
      self.assertEqual(data["maintain_node_health"], mnh)
1261 62e999a5 Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1262 62e999a5 Michael Hanselmann
1263 54d4c13b Michael Hanselmann
  def testRedistributeConfig(self):
1264 54d4c13b Michael Hanselmann
    self.rapi.AddResponse("3364")
1265 54d4c13b Michael Hanselmann
    job_id = self.client.RedistributeConfig()
1266 54d4c13b Michael Hanselmann
    self.assertEqual(job_id, 3364)
1267 54d4c13b Michael Hanselmann
    self.assertItems([])
1268 54d4c13b Michael Hanselmann
    self.assertHandler(rlib2.R_2_redist_config)
1269 54d4c13b Michael Hanselmann
1270 b680c8be Michael Hanselmann
  def testActivateInstanceDisks(self):
1271 b680c8be Michael Hanselmann
    self.rapi.AddResponse("23547")
1272 b680c8be Michael Hanselmann
    job_id = self.client.ActivateInstanceDisks("inst28204")
1273 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 23547)
1274 b680c8be Michael Hanselmann
    self.assertItems(["inst28204"])
1275 b680c8be Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_activate_disks)
1276 b680c8be Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1277 b680c8be Michael Hanselmann
1278 b680c8be Michael Hanselmann
  def testActivateInstanceDisksIgnoreSize(self):
1279 b680c8be Michael Hanselmann
    self.rapi.AddResponse("11044")
1280 b680c8be Michael Hanselmann
    job_id = self.client.ActivateInstanceDisks("inst28204", ignore_size=True)
1281 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 11044)
1282 b680c8be Michael Hanselmann
    self.assertItems(["inst28204"])
1283 b680c8be Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_activate_disks)
1284 b680c8be Michael Hanselmann
    self.assertQuery("ignore_size", ["1"])
1285 b680c8be Michael Hanselmann
1286 b680c8be Michael Hanselmann
  def testDeactivateInstanceDisks(self):
1287 b680c8be Michael Hanselmann
    self.rapi.AddResponse("14591")
1288 b680c8be Michael Hanselmann
    job_id = self.client.DeactivateInstanceDisks("inst28234")
1289 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 14591)
1290 b680c8be Michael Hanselmann
    self.assertItems(["inst28234"])
1291 b680c8be Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_deactivate_disks)
1292 b680c8be Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1293 b680c8be Michael Hanselmann
1294 a52978c7 Michael Hanselmann
  def testRecreateInstanceDisks(self):
1295 a52978c7 Michael Hanselmann
    self.rapi.AddResponse("13553")
1296 a52978c7 Michael Hanselmann
    job_id = self.client.RecreateInstanceDisks("inst23153")
1297 a52978c7 Michael Hanselmann
    self.assertEqual(job_id, 13553)
1298 a52978c7 Michael Hanselmann
    self.assertItems(["inst23153"])
1299 a52978c7 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_recreate_disks)
1300 a52978c7 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1301 a52978c7 Michael Hanselmann
1302 b82d4c5e Michael Hanselmann
  def testGetInstanceConsole(self):
1303 b82d4c5e Michael Hanselmann
    self.rapi.AddResponse("26876")
1304 b82d4c5e Michael Hanselmann
    job_id = self.client.GetInstanceConsole("inst21491")
1305 b82d4c5e Michael Hanselmann
    self.assertEqual(job_id, 26876)
1306 b82d4c5e Michael Hanselmann
    self.assertItems(["inst21491"])
1307 b82d4c5e Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_console)
1308 b82d4c5e Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1309 b82d4c5e Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
1310 b82d4c5e Michael Hanselmann
1311 e23881ed Michael Hanselmann
  def testGrowInstanceDisk(self):
1312 e23881ed Michael Hanselmann
    for idx, wait_for_sync in enumerate([None, False, True]):
1313 e23881ed Michael Hanselmann
      amount = 128 + (512 * idx)
1314 e23881ed Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1315 e23881ed Michael Hanselmann
      self.rapi.AddResponse("30783")
1316 e23881ed Michael Hanselmann
      self.assertEqual(30783,
1317 e23881ed Michael Hanselmann
        self.client.GrowInstanceDisk("eze8ch", idx, amount,
1318 e23881ed Michael Hanselmann
                                     wait_for_sync=wait_for_sync))
1319 e23881ed Michael Hanselmann
      self.assertHandler(rlib2.R_2_instances_name_disk_grow)
1320 e23881ed Michael Hanselmann
      self.assertItems(["eze8ch", str(idx)])
1321 e23881ed Michael Hanselmann
      data = serializer.LoadJson(self.rapi.GetLastRequestData())
1322 e23881ed Michael Hanselmann
      if wait_for_sync is None:
1323 e23881ed Michael Hanselmann
        self.assertEqual(len(data), 1)
1324 e23881ed Michael Hanselmann
        self.assert_("wait_for_sync" not in data)
1325 e23881ed Michael Hanselmann
      else:
1326 e23881ed Michael Hanselmann
        self.assertEqual(len(data), 2)
1327 e23881ed Michael Hanselmann
        self.assertEqual(data["wait_for_sync"], wait_for_sync)
1328 e23881ed Michael Hanselmann
      self.assertEqual(data["amount"], amount)
1329 e23881ed Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1330 e23881ed Michael Hanselmann
1331 414ebaf1 Michael Hanselmann
  def testGetGroupTags(self):
1332 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("[]")
1333 414ebaf1 Michael Hanselmann
    self.assertEqual([], self.client.GetGroupTags("fooGroup"))
1334 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1335 414ebaf1 Michael Hanselmann
    self.assertItems(["fooGroup"])
1336 414ebaf1 Michael Hanselmann
1337 414ebaf1 Michael Hanselmann
  def testAddGroupTags(self):
1338 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("1234")
1339 414ebaf1 Michael Hanselmann
    self.assertEqual(1234,
1340 414ebaf1 Michael Hanselmann
        self.client.AddGroupTags("fooGroup", ["awesome"], dry_run=True))
1341 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1342 414ebaf1 Michael Hanselmann
    self.assertItems(["fooGroup"])
1343 414ebaf1 Michael Hanselmann
    self.assertDryRun()
1344 414ebaf1 Michael Hanselmann
    self.assertQuery("tag", ["awesome"])
1345 414ebaf1 Michael Hanselmann
1346 414ebaf1 Michael Hanselmann
  def testDeleteGroupTags(self):
1347 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("25826")
1348 414ebaf1 Michael Hanselmann
    self.assertEqual(25826, self.client.DeleteGroupTags("foo", ["awesome"],
1349 414ebaf1 Michael Hanselmann
                                                        dry_run=True))
1350 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1351 414ebaf1 Michael Hanselmann
    self.assertItems(["foo"])
1352 414ebaf1 Michael Hanselmann
    self.assertDryRun()
1353 414ebaf1 Michael Hanselmann
    self.assertQuery("tag", ["awesome"])
1354 414ebaf1 Michael Hanselmann
1355 208a6cff Michael Hanselmann
  def testQuery(self):
1356 208a6cff Michael Hanselmann
    for idx, what in enumerate(constants.QR_VIA_RAPI):
1357 2e5c33db Iustin Pop
      for idx2, qfilter in enumerate([None, ["?", "name"]]):
1358 208a6cff Michael Hanselmann
        job_id = 11010 + (idx << 4) + (idx2 << 16)
1359 208a6cff Michael Hanselmann
        fields = sorted(query.ALL_FIELDS[what].keys())[:10]
1360 208a6cff Michael Hanselmann
1361 208a6cff Michael Hanselmann
        self.rapi.AddResponse(str(job_id))
1362 2e5c33db Iustin Pop
        self.assertEqual(self.client.Query(what, fields, qfilter=qfilter),
1363 208a6cff Michael Hanselmann
                         job_id)
1364 208a6cff Michael Hanselmann
        self.assertItems([what])
1365 208a6cff Michael Hanselmann
        self.assertHandler(rlib2.R_2_query)
1366 208a6cff Michael Hanselmann
        self.assertFalse(self.rapi.GetLastHandler().queryargs)
1367 208a6cff Michael Hanselmann
        data = serializer.LoadJson(self.rapi.GetLastRequestData())
1368 208a6cff Michael Hanselmann
        self.assertEqual(data["fields"], fields)
1369 2e5c33db Iustin Pop
        if qfilter is None:
1370 2e5c33db Iustin Pop
          self.assertTrue("qfilter" not in data)
1371 208a6cff Michael Hanselmann
        else:
1372 2e5c33db Iustin Pop
          self.assertEqual(data["qfilter"], qfilter)
1373 208a6cff Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1374 208a6cff Michael Hanselmann
1375 208a6cff Michael Hanselmann
  def testQueryFields(self):
1376 208a6cff Michael Hanselmann
    exp_result = objects.QueryFieldsResponse(fields=[
1377 208a6cff Michael Hanselmann
      objects.QueryFieldDefinition(name="pnode", title="PNode",
1378 208a6cff Michael Hanselmann
                                   kind=constants.QFT_NUMBER),
1379 208a6cff Michael Hanselmann
      objects.QueryFieldDefinition(name="other", title="Other",
1380 208a6cff Michael Hanselmann
                                   kind=constants.QFT_BOOL),
1381 208a6cff Michael Hanselmann
      ])
1382 208a6cff Michael Hanselmann
1383 208a6cff Michael Hanselmann
    for what in constants.QR_VIA_RAPI:
1384 208a6cff Michael Hanselmann
      for fields in [None, ["name", "_unknown_"], ["&", "?|"]]:
1385 208a6cff Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson(exp_result.ToDict()))
1386 208a6cff Michael Hanselmann
        result = self.client.QueryFields(what, fields=fields)
1387 208a6cff Michael Hanselmann
        self.assertItems([what])
1388 208a6cff Michael Hanselmann
        self.assertHandler(rlib2.R_2_query_fields)
1389 208a6cff Michael Hanselmann
        self.assertFalse(self.rapi.GetLastRequestData())
1390 208a6cff Michael Hanselmann
1391 208a6cff Michael Hanselmann
        queryargs = self.rapi.GetLastHandler().queryargs
1392 208a6cff Michael Hanselmann
        if fields is None:
1393 208a6cff Michael Hanselmann
          self.assertFalse(queryargs)
1394 208a6cff Michael Hanselmann
        else:
1395 208a6cff Michael Hanselmann
          self.assertEqual(queryargs, {
1396 208a6cff Michael Hanselmann
            "fields": [",".join(fields)],
1397 208a6cff Michael Hanselmann
            })
1398 208a6cff Michael Hanselmann
1399 208a6cff Michael Hanselmann
        self.assertEqual(objects.QueryFieldsResponse.FromDict(result).ToDict(),
1400 208a6cff Michael Hanselmann
                         exp_result.ToDict())
1401 208a6cff Michael Hanselmann
1402 208a6cff Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1403 208a6cff Michael Hanselmann
1404 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionNoChange(self):
1405 dde0e97c Michael Hanselmann
    resp = serializer.DumpJson({
1406 47099cd1 Michael Hanselmann
      "status": constants.JOB_STATUS_WAITING,
1407 dde0e97c Michael Hanselmann
      })
1408 dde0e97c Michael Hanselmann
1409 dde0e97c Michael Hanselmann
    for retries in [1, 5, 25]:
1410 dde0e97c Michael Hanselmann
      for _ in range(retries):
1411 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(resp)
1412 dde0e97c Michael Hanselmann
1413 dde0e97c Michael Hanselmann
      self.assertFalse(self.client.WaitForJobCompletion(22789, period=None,
1414 dde0e97c Michael Hanselmann
                                                        retries=retries))
1415 dde0e97c Michael Hanselmann
      self.assertHandler(rlib2.R_2_jobs_id)
1416 dde0e97c Michael Hanselmann
      self.assertItems(["22789"])
1417 dde0e97c Michael Hanselmann
1418 dde0e97c Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1419 dde0e97c Michael Hanselmann
1420 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionAlreadyFinished(self):
1421 dde0e97c Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson({
1422 dde0e97c Michael Hanselmann
      "status": constants.JOB_STATUS_SUCCESS,
1423 dde0e97c Michael Hanselmann
      }))
1424 dde0e97c Michael Hanselmann
1425 dde0e97c Michael Hanselmann
    self.assertTrue(self.client.WaitForJobCompletion(22793, period=None,
1426 dde0e97c Michael Hanselmann
                                                     retries=1))
1427 dde0e97c Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id)
1428 dde0e97c Michael Hanselmann
    self.assertItems(["22793"])
1429 dde0e97c Michael Hanselmann
1430 dde0e97c Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1431 dde0e97c Michael Hanselmann
1432 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionEmptyResponse(self):
1433 dde0e97c Michael Hanselmann
    self.rapi.AddResponse("{}")
1434 dde0e97c Michael Hanselmann
    self.assertFalse(self.client.WaitForJobCompletion(22793, period=None,
1435 dde0e97c Michael Hanselmann
                                                     retries=10))
1436 dde0e97c Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id)
1437 dde0e97c Michael Hanselmann
    self.assertItems(["22793"])
1438 dde0e97c Michael Hanselmann
1439 dde0e97c Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1440 dde0e97c Michael Hanselmann
1441 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionOutOfRetries(self):
1442 dde0e97c Michael Hanselmann
    for retries in [3, 10, 21]:
1443 dde0e97c Michael Hanselmann
      for _ in range(retries):
1444 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson({
1445 dde0e97c Michael Hanselmann
          "status": constants.JOB_STATUS_RUNNING,
1446 dde0e97c Michael Hanselmann
          }))
1447 dde0e97c Michael Hanselmann
1448 dde0e97c Michael Hanselmann
      self.assertFalse(self.client.WaitForJobCompletion(30948, period=None,
1449 dde0e97c Michael Hanselmann
                                                        retries=retries - 1))
1450 dde0e97c Michael Hanselmann
      self.assertHandler(rlib2.R_2_jobs_id)
1451 dde0e97c Michael Hanselmann
      self.assertItems(["30948"])
1452 dde0e97c Michael Hanselmann
1453 dde0e97c Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 1)
1454 dde0e97c Michael Hanselmann
      self.rapi.ResetResponses()
1455 dde0e97c Michael Hanselmann
1456 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionSuccessAndFailure(self):
1457 dde0e97c Michael Hanselmann
    for retries in [1, 4, 13]:
1458 dde0e97c Michael Hanselmann
      for (success, end_status) in [(False, constants.JOB_STATUS_ERROR),
1459 dde0e97c Michael Hanselmann
                                    (True, constants.JOB_STATUS_SUCCESS)]:
1460 dde0e97c Michael Hanselmann
        for _ in range(retries):
1461 dde0e97c Michael Hanselmann
          self.rapi.AddResponse(serializer.DumpJson({
1462 dde0e97c Michael Hanselmann
            "status": constants.JOB_STATUS_RUNNING,
1463 dde0e97c Michael Hanselmann
            }))
1464 dde0e97c Michael Hanselmann
1465 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson({
1466 dde0e97c Michael Hanselmann
          "status": end_status,
1467 dde0e97c Michael Hanselmann
          }))
1468 dde0e97c Michael Hanselmann
1469 dde0e97c Michael Hanselmann
        result = self.client.WaitForJobCompletion(3187, period=None,
1470 dde0e97c Michael Hanselmann
                                                  retries=retries + 1)
1471 dde0e97c Michael Hanselmann
        self.assertEqual(result, success)
1472 dde0e97c Michael Hanselmann
        self.assertHandler(rlib2.R_2_jobs_id)
1473 dde0e97c Michael Hanselmann
        self.assertItems(["3187"])
1474 dde0e97c Michael Hanselmann
1475 dde0e97c Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1476 dde0e97c Michael Hanselmann
1477 95ab4de9 David Knowles
1478 70b0d2a2 Michael Hanselmann
class RapiTestRunner(unittest.TextTestRunner):
1479 70b0d2a2 Michael Hanselmann
  def run(self, *args):
1480 70b0d2a2 Michael Hanselmann
    global _used_handlers
1481 70b0d2a2 Michael Hanselmann
    assert _used_handlers is None
1482 70b0d2a2 Michael Hanselmann
1483 70b0d2a2 Michael Hanselmann
    _used_handlers = set()
1484 70b0d2a2 Michael Hanselmann
    try:
1485 70b0d2a2 Michael Hanselmann
      # Run actual tests
1486 70b0d2a2 Michael Hanselmann
      result = unittest.TextTestRunner.run(self, *args)
1487 70b0d2a2 Michael Hanselmann
1488 70b0d2a2 Michael Hanselmann
      diff = (set(connector.CONNECTOR.values()) - _used_handlers -
1489 70b0d2a2 Michael Hanselmann
             _KNOWN_UNUSED)
1490 70b0d2a2 Michael Hanselmann
      if diff:
1491 70b0d2a2 Michael Hanselmann
        raise AssertionError("The following RAPI resources were not used by the"
1492 70b0d2a2 Michael Hanselmann
                             " RAPI client: %r" % utils.CommaJoin(diff))
1493 70b0d2a2 Michael Hanselmann
    finally:
1494 70b0d2a2 Michael Hanselmann
      # Reset global variable
1495 70b0d2a2 Michael Hanselmann
      _used_handlers = None
1496 70b0d2a2 Michael Hanselmann
1497 70b0d2a2 Michael Hanselmann
    return result
1498 70b0d2a2 Michael Hanselmann
1499 70b0d2a2 Michael Hanselmann
1500 2f96c43c Michael Hanselmann
if __name__ == "__main__":
1501 70b0d2a2 Michael Hanselmann
  client.UsesRapiClient(testutils.GanetiTestProgram)(testRunner=RapiTestRunner)