Statistics
| Branch: | Tag: | Revision:

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

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