Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (57.7 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 3312709d Leon Handreke
    self.rapi.AddResponse('[ { "id": "123", "uri": "\\/2\\/jobs\\/123" },'
841 3312709d Leon Handreke
                          '  { "id": "124", "uri": "\\/2\\/jobs\\/124" } ]')
842 3312709d Leon Handreke
    self.assertEqual([{"id": "123", "uri": "/2/jobs/123"},
843 3312709d Leon Handreke
                      {"id": "124", "uri": "/2/jobs/124"}],
844 3312709d Leon Handreke
                      self.client.GetJobs(bulk=True))
845 3312709d Leon Handreke
    self.assertHandler(rlib2.R_2_jobs)
846 3312709d Leon Handreke
    self.assertBulk()
847 3312709d Leon Handreke
848 95ab4de9 David Knowles
  def testGetJobStatus(self):
849 95ab4de9 David Knowles
    self.rapi.AddResponse("{\"foo\": \"bar\"}")
850 95ab4de9 David Knowles
    self.assertEqual({"foo": "bar"}, self.client.GetJobStatus(1234))
851 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
852 95ab4de9 David Knowles
    self.assertItems(["1234"])
853 95ab4de9 David Knowles
854 d9b67f70 Michael Hanselmann
  def testWaitForJobChange(self):
855 d9b67f70 Michael Hanselmann
    fields = ["id", "summary"]
856 d9b67f70 Michael Hanselmann
    expected = {
857 d9b67f70 Michael Hanselmann
      "job_info": [123, "something"],
858 d9b67f70 Michael Hanselmann
      "log_entries": [],
859 d9b67f70 Michael Hanselmann
      }
860 d9b67f70 Michael Hanselmann
861 d9b67f70 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson(expected))
862 d9b67f70 Michael Hanselmann
    result = self.client.WaitForJobChange(123, fields, [], -1)
863 d9b67f70 Michael Hanselmann
    self.assertEqualValues(expected, result)
864 d9b67f70 Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id_wait)
865 d9b67f70 Michael Hanselmann
    self.assertItems(["123"])
866 d9b67f70 Michael Hanselmann
867 cf9ada49 Michael Hanselmann
  def testCancelJob(self):
868 cd577680 Michael Hanselmann
    self.rapi.AddResponse("[true, \"Job 123 will be canceled\"]")
869 cd577680 Michael Hanselmann
    self.assertEqual([True, "Job 123 will be canceled"],
870 cf9ada49 Michael Hanselmann
                     self.client.CancelJob(999, dry_run=True))
871 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
872 95ab4de9 David Knowles
    self.assertItems(["999"])
873 95ab4de9 David Knowles
    self.assertDryRun()
874 95ab4de9 David Knowles
875 95ab4de9 David Knowles
  def testGetNodes(self):
876 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
877 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
878 95ab4de9 David Knowles
    self.assertEqual(["node1", "node2"], self.client.GetNodes())
879 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
880 95ab4de9 David Knowles
881 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
882 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
883 95ab4de9 David Knowles
    self.assertEqual([{"id": "node1", "uri": "uri1"},
884 95ab4de9 David Knowles
                      {"id": "node2", "uri": "uri2"}],
885 95ab4de9 David Knowles
                     self.client.GetNodes(bulk=True))
886 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
887 95ab4de9 David Knowles
    self.assertBulk()
888 95ab4de9 David Knowles
889 591e5103 Michael Hanselmann
  def testGetNode(self):
890 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
891 591e5103 Michael Hanselmann
    self.assertEqual({}, self.client.GetNode("node-foo"))
892 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name)
893 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
894 95ab4de9 David Knowles
895 95ab4de9 David Knowles
  def testEvacuateNode(self):
896 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_EVAC_RES1]))
897 95ab4de9 David Knowles
    self.rapi.AddResponse("9876")
898 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-1", remote_node="node-2")
899 95ab4de9 David Knowles
    self.assertEqual(9876, job_id)
900 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_evacuate)
901 95ab4de9 David Knowles
    self.assertItems(["node-1"])
902 de40437a Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
903 de40437a Michael Hanselmann
                     { "remote_node": "node-2", })
904 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
905 95ab4de9 David Knowles
906 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_EVAC_RES1]))
907 95ab4de9 David Knowles
    self.rapi.AddResponse("8888")
908 0b58db81 Michael Hanselmann
    job_id = self.client.EvacuateNode("node-3", iallocator="hail", dry_run=True,
909 cb92e7a1 Michael Hanselmann
                                      mode=constants.NODE_EVAC_ALL,
910 0b58db81 Michael Hanselmann
                                      early_release=True)
911 95ab4de9 David Knowles
    self.assertEqual(8888, job_id)
912 95ab4de9 David Knowles
    self.assertItems(["node-3"])
913 0b58db81 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()), {
914 0b58db81 Michael Hanselmann
      "iallocator": "hail",
915 0b58db81 Michael Hanselmann
      "mode": "all",
916 0b58db81 Michael Hanselmann
      "early_release": True,
917 0b58db81 Michael Hanselmann
      })
918 95ab4de9 David Knowles
    self.assertDryRun()
919 95ab4de9 David Knowles
920 95ab4de9 David Knowles
    self.assertRaises(client.GanetiApiError,
921 95ab4de9 David Knowles
                      self.client.EvacuateNode,
922 95ab4de9 David Knowles
                      "node-4", iallocator="hail", remote_node="node-5")
923 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
924 de40437a Michael Hanselmann
925 de40437a Michael Hanselmann
  def testEvacuateNodeOldResponse(self):
926 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
927 de40437a Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.EvacuateNode,
928 de40437a Michael Hanselmann
                      "node-4", accept_old=False)
929 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
930 de40437a Michael Hanselmann
931 0b58db81 Michael Hanselmann
    for mode in [client.NODE_EVAC_PRI, client.NODE_EVAC_ALL]:
932 0b58db81 Michael Hanselmann
      self.rapi.AddResponse(serializer.DumpJson([]))
933 0b58db81 Michael Hanselmann
      self.assertRaises(client.GanetiApiError, self.client.EvacuateNode,
934 0b58db81 Michael Hanselmann
                        "node-4", accept_old=True, mode=mode)
935 0b58db81 Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
936 de40437a Michael Hanselmann
937 de40437a Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
938 0b58db81 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson("21533"))
939 0b58db81 Michael Hanselmann
    result = self.client.EvacuateNode("node-3", iallocator="hail",
940 0b58db81 Michael Hanselmann
                                      dry_run=True, accept_old=True,
941 0b58db81 Michael Hanselmann
                                      mode=client.NODE_EVAC_SEC,
942 0b58db81 Michael Hanselmann
                                      early_release=True)
943 0b58db81 Michael Hanselmann
    self.assertEqual(result, "21533")
944 0b58db81 Michael Hanselmann
    self.assertItems(["node-3"])
945 0b58db81 Michael Hanselmann
    self.assertQuery("iallocator", ["hail"])
946 0b58db81 Michael Hanselmann
    self.assertQuery("early_release", ["1"])
947 0b58db81 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
948 0b58db81 Michael Hanselmann
    self.assertDryRun()
949 de40437a Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
950 de40437a Michael Hanselmann
951 95ab4de9 David Knowles
  def testMigrateNode(self):
952 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
953 95ab4de9 David Knowles
    self.rapi.AddResponse("1111")
954 95ab4de9 David Knowles
    self.assertEqual(1111, self.client.MigrateNode("node-a", dry_run=True))
955 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
956 95ab4de9 David Knowles
    self.assertItems(["node-a"])
957 1f334d96 Iustin Pop
    self.assert_("mode" not in self.rapi.GetLastHandler().queryargs)
958 1f334d96 Iustin Pop
    self.assertDryRun()
959 b7a1c816 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
960 1f334d96 Iustin Pop
961 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
962 1f334d96 Iustin Pop
    self.rapi.AddResponse("1112")
963 1f334d96 Iustin Pop
    self.assertEqual(1112, self.client.MigrateNode("node-a", dry_run=True,
964 1f334d96 Iustin Pop
                                                   mode="live"))
965 1f334d96 Iustin Pop
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
966 1f334d96 Iustin Pop
    self.assertItems(["node-a"])
967 1f334d96 Iustin Pop
    self.assertQuery("mode", ["live"])
968 95ab4de9 David Knowles
    self.assertDryRun()
969 b7a1c816 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
970 b7a1c816 Michael Hanselmann
971 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
972 b7a1c816 Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.MigrateNode,
973 b7a1c816 Michael Hanselmann
                      "node-c", target_node="foonode")
974 b7a1c816 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
975 b7a1c816 Michael Hanselmann
976 b7a1c816 Michael Hanselmann
  def testMigrateNodeBodyData(self):
977 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_MIGRATE_REQV1]))
978 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse("27539")
979 b7a1c816 Michael Hanselmann
    self.assertEqual(27539, self.client.MigrateNode("node-a", dry_run=False,
980 b7a1c816 Michael Hanselmann
                                                    mode="live"))
981 b7a1c816 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
982 b7a1c816 Michael Hanselmann
    self.assertItems(["node-a"])
983 b7a1c816 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
984 b7a1c816 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
985 b7a1c816 Michael Hanselmann
                     { "mode": "live", })
986 b7a1c816 Michael Hanselmann
987 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._NODE_MIGRATE_REQV1]))
988 b7a1c816 Michael Hanselmann
    self.rapi.AddResponse("14219")
989 b7a1c816 Michael Hanselmann
    self.assertEqual(14219, self.client.MigrateNode("node-x", dry_run=True,
990 b7a1c816 Michael Hanselmann
                                                    target_node="node9",
991 b7a1c816 Michael Hanselmann
                                                    iallocator="ial"))
992 b7a1c816 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
993 b7a1c816 Michael Hanselmann
    self.assertItems(["node-x"])
994 b7a1c816 Michael Hanselmann
    self.assertDryRun()
995 b7a1c816 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
996 b7a1c816 Michael Hanselmann
                     { "target_node": "node9", "iallocator": "ial", })
997 b7a1c816 Michael Hanselmann
998 b7a1c816 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
999 95ab4de9 David Knowles
1000 95ab4de9 David Knowles
  def testGetNodeRole(self):
1001 95ab4de9 David Knowles
    self.rapi.AddResponse("\"master\"")
1002 95ab4de9 David Knowles
    self.assertEqual("master", self.client.GetNodeRole("node-a"))
1003 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
1004 95ab4de9 David Knowles
    self.assertItems(["node-a"])
1005 95ab4de9 David Knowles
1006 95ab4de9 David Knowles
  def testSetNodeRole(self):
1007 95ab4de9 David Knowles
    self.rapi.AddResponse("789")
1008 95ab4de9 David Knowles
    self.assertEqual(789,
1009 95ab4de9 David Knowles
        self.client.SetNodeRole("node-foo", "master-candidate", force=True))
1010 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
1011 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
1012 10f5ab6c Michael Hanselmann
    self.assertQuery("force", ["1"])
1013 2a7c3583 Michael Hanselmann
    self.assertEqual("\"master-candidate\"", self.rapi.GetLastRequestData())
1014 95ab4de9 David Knowles
1015 42d4d8b9 Michael Hanselmann
  def testPowercycleNode(self):
1016 42d4d8b9 Michael Hanselmann
    self.rapi.AddResponse("23051")
1017 42d4d8b9 Michael Hanselmann
    self.assertEqual(23051,
1018 42d4d8b9 Michael Hanselmann
        self.client.PowercycleNode("node5468", force=True))
1019 42d4d8b9 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_powercycle)
1020 42d4d8b9 Michael Hanselmann
    self.assertItems(["node5468"])
1021 42d4d8b9 Michael Hanselmann
    self.assertQuery("force", ["1"])
1022 42d4d8b9 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
1023 42d4d8b9 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1024 42d4d8b9 Michael Hanselmann
1025 94497dd1 Michael Hanselmann
  def testModifyNode(self):
1026 94497dd1 Michael Hanselmann
    self.rapi.AddResponse("3783")
1027 94497dd1 Michael Hanselmann
    job_id = self.client.ModifyNode("node16979.example.com", drained=True)
1028 94497dd1 Michael Hanselmann
    self.assertEqual(job_id, 3783)
1029 94497dd1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_modify)
1030 94497dd1 Michael Hanselmann
    self.assertItems(["node16979.example.com"])
1031 94497dd1 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1032 94497dd1 Michael Hanselmann
1033 95ab4de9 David Knowles
  def testGetNodeStorageUnits(self):
1034 95ab4de9 David Knowles
    self.rapi.AddResponse("42")
1035 95ab4de9 David Knowles
    self.assertEqual(42,
1036 95ab4de9 David Knowles
        self.client.GetNodeStorageUnits("node-x", "lvm-pv", "fields"))
1037 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage)
1038 95ab4de9 David Knowles
    self.assertItems(["node-x"])
1039 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
1040 95ab4de9 David Knowles
    self.assertQuery("output_fields", ["fields"])
1041 95ab4de9 David Knowles
1042 95ab4de9 David Knowles
  def testModifyNodeStorageUnits(self):
1043 95ab4de9 David Knowles
    self.rapi.AddResponse("14")
1044 95ab4de9 David Knowles
    self.assertEqual(14,
1045 95ab4de9 David Knowles
        self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda"))
1046 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
1047 95ab4de9 David Knowles
    self.assertItems(["node-z"])
1048 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
1049 95ab4de9 David Knowles
    self.assertQuery("name", ["hda"])
1050 fde28316 Michael Hanselmann
    self.assertQuery("allocatable", None)
1051 fde28316 Michael Hanselmann
1052 fde28316 Michael Hanselmann
    for allocatable, query_allocatable in [(True, "1"), (False, "0")]:
1053 fde28316 Michael Hanselmann
      self.rapi.AddResponse("7205")
1054 fde28316 Michael Hanselmann
      job_id = self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda",
1055 fde28316 Michael Hanselmann
                                                  allocatable=allocatable)
1056 fde28316 Michael Hanselmann
      self.assertEqual(7205, job_id)
1057 fde28316 Michael Hanselmann
      self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
1058 fde28316 Michael Hanselmann
      self.assertItems(["node-z"])
1059 fde28316 Michael Hanselmann
      self.assertQuery("storage_type", ["lvm-pv"])
1060 fde28316 Michael Hanselmann
      self.assertQuery("name", ["hda"])
1061 fde28316 Michael Hanselmann
      self.assertQuery("allocatable", [query_allocatable])
1062 95ab4de9 David Knowles
1063 752df8bb Michael Hanselmann
  def testRepairNodeStorageUnits(self):
1064 752df8bb Michael Hanselmann
    self.rapi.AddResponse("99")
1065 752df8bb Michael Hanselmann
    self.assertEqual(99, self.client.RepairNodeStorageUnits("node-z", "lvm-pv",
1066 752df8bb Michael Hanselmann
                                                            "hda"))
1067 752df8bb Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_storage_repair)
1068 752df8bb Michael Hanselmann
    self.assertItems(["node-z"])
1069 752df8bb Michael Hanselmann
    self.assertQuery("storage_type", ["lvm-pv"])
1070 752df8bb Michael Hanselmann
    self.assertQuery("name", ["hda"])
1071 752df8bb Michael Hanselmann
1072 95ab4de9 David Knowles
  def testGetNodeTags(self):
1073 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"fry\", \"bender\"]")
1074 95ab4de9 David Knowles
    self.assertEqual(["fry", "bender"], self.client.GetNodeTags("node-k"))
1075 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1076 95ab4de9 David Knowles
    self.assertItems(["node-k"])
1077 95ab4de9 David Knowles
1078 95ab4de9 David Knowles
  def testAddNodeTags(self):
1079 cab667cc David Knowles
    self.rapi.AddResponse("1234")
1080 cab667cc David Knowles
    self.assertEqual(1234,
1081 cab667cc David Knowles
        self.client.AddNodeTags("node-v", ["awesome"], dry_run=True))
1082 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1083 95ab4de9 David Knowles
    self.assertItems(["node-v"])
1084 95ab4de9 David Knowles
    self.assertDryRun()
1085 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
1086 95ab4de9 David Knowles
1087 95ab4de9 David Knowles
  def testDeleteNodeTags(self):
1088 cd577680 Michael Hanselmann
    self.rapi.AddResponse("16861")
1089 cd577680 Michael Hanselmann
    self.assertEqual(16861, self.client.DeleteNodeTags("node-w", ["awesome"],
1090 cd577680 Michael Hanselmann
                                                       dry_run=True))
1091 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1092 95ab4de9 David Knowles
    self.assertItems(["node-w"])
1093 95ab4de9 David Knowles
    self.assertDryRun()
1094 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
1095 95ab4de9 David Knowles
1096 a268af8d Adeodato Simo
  def testGetGroups(self):
1097 a268af8d Adeodato Simo
    groups = [{"name": "group1",
1098 a268af8d Adeodato Simo
               "uri": "/2/groups/group1",
1099 a268af8d Adeodato Simo
               },
1100 a268af8d Adeodato Simo
              {"name": "group2",
1101 a268af8d Adeodato Simo
               "uri": "/2/groups/group2",
1102 a268af8d Adeodato Simo
               },
1103 a268af8d Adeodato Simo
              ]
1104 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(groups))
1105 a268af8d Adeodato Simo
    self.assertEqual(["group1", "group2"], self.client.GetGroups())
1106 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1107 a268af8d Adeodato Simo
1108 a268af8d Adeodato Simo
  def testGetGroupsBulk(self):
1109 a268af8d Adeodato Simo
    groups = [{"name": "group1",
1110 a268af8d Adeodato Simo
               "uri": "/2/groups/group1",
1111 a268af8d Adeodato Simo
               "node_cnt": 2,
1112 a268af8d Adeodato Simo
               "node_list": ["gnt1.test",
1113 a268af8d Adeodato Simo
                             "gnt2.test",
1114 a268af8d Adeodato Simo
                             ],
1115 a268af8d Adeodato Simo
               },
1116 a268af8d Adeodato Simo
              {"name": "group2",
1117 a268af8d Adeodato Simo
               "uri": "/2/groups/group2",
1118 a268af8d Adeodato Simo
               "node_cnt": 1,
1119 a268af8d Adeodato Simo
               "node_list": ["gnt3.test",
1120 a268af8d Adeodato Simo
                             ],
1121 a268af8d Adeodato Simo
               },
1122 a268af8d Adeodato Simo
              ]
1123 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(groups))
1124 a268af8d Adeodato Simo
1125 a268af8d Adeodato Simo
    self.assertEqual(groups, self.client.GetGroups(bulk=True))
1126 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1127 a268af8d Adeodato Simo
    self.assertBulk()
1128 a268af8d Adeodato Simo
1129 a268af8d Adeodato Simo
  def testGetGroup(self):
1130 a268af8d Adeodato Simo
    group = {"ctime": None,
1131 a268af8d Adeodato Simo
             "name": "default",
1132 a268af8d Adeodato Simo
             }
1133 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(group))
1134 a268af8d Adeodato Simo
    self.assertEqual({"ctime": None, "name": "default"},
1135 a268af8d Adeodato Simo
                     self.client.GetGroup("default"))
1136 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name)
1137 a268af8d Adeodato Simo
    self.assertItems(["default"])
1138 a268af8d Adeodato Simo
1139 a268af8d Adeodato Simo
  def testCreateGroup(self):
1140 a268af8d Adeodato Simo
    self.rapi.AddResponse("12345")
1141 a268af8d Adeodato Simo
    job_id = self.client.CreateGroup("newgroup", dry_run=True)
1142 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12345)
1143 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1144 a268af8d Adeodato Simo
    self.assertDryRun()
1145 a268af8d Adeodato Simo
1146 a268af8d Adeodato Simo
  def testDeleteGroup(self):
1147 a268af8d Adeodato Simo
    self.rapi.AddResponse("12346")
1148 a268af8d Adeodato Simo
    job_id = self.client.DeleteGroup("newgroup", dry_run=True)
1149 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12346)
1150 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name)
1151 a268af8d Adeodato Simo
    self.assertDryRun()
1152 a268af8d Adeodato Simo
1153 a268af8d Adeodato Simo
  def testRenameGroup(self):
1154 a268af8d Adeodato Simo
    self.rapi.AddResponse("12347")
1155 a268af8d Adeodato Simo
    job_id = self.client.RenameGroup("oldname", "newname")
1156 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12347)
1157 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_rename)
1158 a268af8d Adeodato Simo
1159 7187e6ff Adeodato Simo
  def testModifyGroup(self):
1160 7187e6ff Adeodato Simo
    self.rapi.AddResponse("12348")
1161 7187e6ff Adeodato Simo
    job_id = self.client.ModifyGroup("mygroup", alloc_policy="foo")
1162 7187e6ff Adeodato Simo
    self.assertEqual(job_id, 12348)
1163 7187e6ff Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_modify)
1164 7187e6ff Adeodato Simo
1165 4245446f Adeodato Simo
  def testAssignGroupNodes(self):
1166 4245446f Adeodato Simo
    self.rapi.AddResponse("12349")
1167 4245446f Adeodato Simo
    job_id = self.client.AssignGroupNodes("mygroup", ["node1", "node2"],
1168 4245446f Adeodato Simo
                                          force=True, dry_run=True)
1169 4245446f Adeodato Simo
    self.assertEqual(job_id, 12349)
1170 4245446f Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_assign_nodes)
1171 4245446f Adeodato Simo
    self.assertDryRun()
1172 4245446f Adeodato Simo
    self.assertUseForce()
1173 4245446f Adeodato Simo
1174 6e8091f9 Dimitris Aragiorgis
  def testGetNetworksBulk(self):
1175 6e8091f9 Dimitris Aragiorgis
    networks = [{"name": "network1",
1176 6e8091f9 Dimitris Aragiorgis
               "uri": "/2/networks/network1",
1177 6e8091f9 Dimitris Aragiorgis
               "network": "192.168.0.0/24",
1178 6e8091f9 Dimitris Aragiorgis
               },
1179 6e8091f9 Dimitris Aragiorgis
              {"name": "network2",
1180 6e8091f9 Dimitris Aragiorgis
               "uri": "/2/networks/network2",
1181 6e8091f9 Dimitris Aragiorgis
               "network": "192.168.0.0/24",
1182 6e8091f9 Dimitris Aragiorgis
               },
1183 6e8091f9 Dimitris Aragiorgis
              ]
1184 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse(serializer.DumpJson(networks))
1185 6e8091f9 Dimitris Aragiorgis
1186 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(networks, self.client.GetNetworks(bulk=True))
1187 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks)
1188 6e8091f9 Dimitris Aragiorgis
    self.assertBulk()
1189 6e8091f9 Dimitris Aragiorgis
1190 6e8091f9 Dimitris Aragiorgis
  def testGetNetwork(self):
1191 6e8091f9 Dimitris Aragiorgis
    network = {"ctime": None,
1192 6e8091f9 Dimitris Aragiorgis
               "name": "network1",
1193 6e8091f9 Dimitris Aragiorgis
               }
1194 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse(serializer.DumpJson(network))
1195 6e8091f9 Dimitris Aragiorgis
    self.assertEqual({"ctime": None, "name": "network1"},
1196 6e8091f9 Dimitris Aragiorgis
                     self.client.GetNetwork("network1"))
1197 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name)
1198 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["network1"])
1199 6e8091f9 Dimitris Aragiorgis
1200 6e8091f9 Dimitris Aragiorgis
  def testCreateNetwork(self):
1201 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12345")
1202 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.CreateNetwork("newnetwork", network="192.168.0.0/24",
1203 6e8091f9 Dimitris Aragiorgis
                                       dry_run=True)
1204 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12345)
1205 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks)
1206 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1207 6e8091f9 Dimitris Aragiorgis
1208 6e8091f9 Dimitris Aragiorgis
  def testModifyNetwork(self):
1209 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12346")
1210 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.ModifyNetwork("mynetwork", gateway="192.168.0.10",
1211 6e8091f9 Dimitris Aragiorgis
                                     dry_run=True)
1212 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12346)
1213 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_modify)
1214 6e8091f9 Dimitris Aragiorgis
1215 6e8091f9 Dimitris Aragiorgis
  def testDeleteNetwork(self):
1216 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12347")
1217 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.DeleteNetwork("newnetwork", dry_run=True)
1218 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12347)
1219 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name)
1220 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1221 6e8091f9 Dimitris Aragiorgis
1222 6e8091f9 Dimitris Aragiorgis
  def testConnectNetwork(self):
1223 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12348")
1224 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.ConnectNetwork("mynetwork", "default",
1225 6e8091f9 Dimitris Aragiorgis
                                        "bridged", "br0", dry_run=True)
1226 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12348)
1227 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_connect)
1228 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1229 6e8091f9 Dimitris Aragiorgis
1230 6e8091f9 Dimitris Aragiorgis
  def testDisconnectNetwork(self):
1231 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("12349")
1232 6e8091f9 Dimitris Aragiorgis
    job_id = self.client.DisconnectNetwork("mynetwork", "default", dry_run=True)
1233 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(job_id, 12349)
1234 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_disconnect)
1235 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1236 6e8091f9 Dimitris Aragiorgis
1237 6e8091f9 Dimitris Aragiorgis
  def testGetNetworkTags(self):
1238 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("[]")
1239 6e8091f9 Dimitris Aragiorgis
    self.assertEqual([], self.client.GetNetworkTags("fooNetwork"))
1240 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_tags)
1241 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["fooNetwork"])
1242 6e8091f9 Dimitris Aragiorgis
1243 6e8091f9 Dimitris Aragiorgis
  def testAddNetworkTags(self):
1244 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("1234")
1245 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(1234,
1246 6e8091f9 Dimitris Aragiorgis
        self.client.AddNetworkTags("fooNetwork", ["awesome"], dry_run=True))
1247 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_tags)
1248 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["fooNetwork"])
1249 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1250 6e8091f9 Dimitris Aragiorgis
    self.assertQuery("tag", ["awesome"])
1251 6e8091f9 Dimitris Aragiorgis
1252 6e8091f9 Dimitris Aragiorgis
  def testDeleteNetworkTags(self):
1253 6e8091f9 Dimitris Aragiorgis
    self.rapi.AddResponse("25826")
1254 6e8091f9 Dimitris Aragiorgis
    self.assertEqual(25826, self.client.DeleteNetworkTags("foo", ["awesome"],
1255 6e8091f9 Dimitris Aragiorgis
                                                          dry_run=True))
1256 6e8091f9 Dimitris Aragiorgis
    self.assertHandler(rlib2.R_2_networks_name_tags)
1257 6e8091f9 Dimitris Aragiorgis
    self.assertItems(["foo"])
1258 6e8091f9 Dimitris Aragiorgis
    self.assertDryRun()
1259 6e8091f9 Dimitris Aragiorgis
    self.assertQuery("tag", ["awesome"])
1260 6e8091f9 Dimitris Aragiorgis
1261 08c11c40 Michael Hanselmann
  def testModifyInstance(self):
1262 08c11c40 Michael Hanselmann
    self.rapi.AddResponse("23681")
1263 08c11c40 Michael Hanselmann
    job_id = self.client.ModifyInstance("inst7210", os_name="linux")
1264 08c11c40 Michael Hanselmann
    self.assertEqual(job_id, 23681)
1265 08c11c40 Michael Hanselmann
    self.assertItems(["inst7210"])
1266 08c11c40 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_modify)
1267 08c11c40 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
1268 08c11c40 Michael Hanselmann
                     { "os_name": "linux", })
1269 08c11c40 Michael Hanselmann
1270 62e999a5 Michael Hanselmann
  def testModifyCluster(self):
1271 62e999a5 Michael Hanselmann
    for mnh in [None, False, True]:
1272 62e999a5 Michael Hanselmann
      self.rapi.AddResponse("14470")
1273 62e999a5 Michael Hanselmann
      self.assertEqual(14470,
1274 62e999a5 Michael Hanselmann
        self.client.ModifyCluster(maintain_node_health=mnh))
1275 62e999a5 Michael Hanselmann
      self.assertHandler(rlib2.R_2_cluster_modify)
1276 62e999a5 Michael Hanselmann
      self.assertItems([])
1277 62e999a5 Michael Hanselmann
      data = serializer.LoadJson(self.rapi.GetLastRequestData())
1278 62e999a5 Michael Hanselmann
      self.assertEqual(len(data), 1)
1279 62e999a5 Michael Hanselmann
      self.assertEqual(data["maintain_node_health"], mnh)
1280 62e999a5 Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1281 62e999a5 Michael Hanselmann
1282 54d4c13b Michael Hanselmann
  def testRedistributeConfig(self):
1283 54d4c13b Michael Hanselmann
    self.rapi.AddResponse("3364")
1284 54d4c13b Michael Hanselmann
    job_id = self.client.RedistributeConfig()
1285 54d4c13b Michael Hanselmann
    self.assertEqual(job_id, 3364)
1286 54d4c13b Michael Hanselmann
    self.assertItems([])
1287 54d4c13b Michael Hanselmann
    self.assertHandler(rlib2.R_2_redist_config)
1288 54d4c13b Michael Hanselmann
1289 b680c8be Michael Hanselmann
  def testActivateInstanceDisks(self):
1290 b680c8be Michael Hanselmann
    self.rapi.AddResponse("23547")
1291 b680c8be Michael Hanselmann
    job_id = self.client.ActivateInstanceDisks("inst28204")
1292 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 23547)
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.assertFalse(self.rapi.GetLastHandler().queryargs)
1296 b680c8be Michael Hanselmann
1297 b680c8be Michael Hanselmann
  def testActivateInstanceDisksIgnoreSize(self):
1298 b680c8be Michael Hanselmann
    self.rapi.AddResponse("11044")
1299 b680c8be Michael Hanselmann
    job_id = self.client.ActivateInstanceDisks("inst28204", ignore_size=True)
1300 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 11044)
1301 b680c8be Michael Hanselmann
    self.assertItems(["inst28204"])
1302 b680c8be Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_activate_disks)
1303 b680c8be Michael Hanselmann
    self.assertQuery("ignore_size", ["1"])
1304 b680c8be Michael Hanselmann
1305 b680c8be Michael Hanselmann
  def testDeactivateInstanceDisks(self):
1306 b680c8be Michael Hanselmann
    self.rapi.AddResponse("14591")
1307 b680c8be Michael Hanselmann
    job_id = self.client.DeactivateInstanceDisks("inst28234")
1308 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 14591)
1309 b680c8be Michael Hanselmann
    self.assertItems(["inst28234"])
1310 b680c8be Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_deactivate_disks)
1311 b680c8be Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1312 b680c8be Michael Hanselmann
1313 a52978c7 Michael Hanselmann
  def testRecreateInstanceDisks(self):
1314 a52978c7 Michael Hanselmann
    self.rapi.AddResponse("13553")
1315 a52978c7 Michael Hanselmann
    job_id = self.client.RecreateInstanceDisks("inst23153")
1316 a52978c7 Michael Hanselmann
    self.assertEqual(job_id, 13553)
1317 a52978c7 Michael Hanselmann
    self.assertItems(["inst23153"])
1318 a52978c7 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_recreate_disks)
1319 a52978c7 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1320 a52978c7 Michael Hanselmann
1321 b82d4c5e Michael Hanselmann
  def testGetInstanceConsole(self):
1322 b82d4c5e Michael Hanselmann
    self.rapi.AddResponse("26876")
1323 b82d4c5e Michael Hanselmann
    job_id = self.client.GetInstanceConsole("inst21491")
1324 b82d4c5e Michael Hanselmann
    self.assertEqual(job_id, 26876)
1325 b82d4c5e Michael Hanselmann
    self.assertItems(["inst21491"])
1326 b82d4c5e Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_console)
1327 b82d4c5e Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1328 b82d4c5e Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
1329 b82d4c5e Michael Hanselmann
1330 e23881ed Michael Hanselmann
  def testGrowInstanceDisk(self):
1331 e23881ed Michael Hanselmann
    for idx, wait_for_sync in enumerate([None, False, True]):
1332 e23881ed Michael Hanselmann
      amount = 128 + (512 * idx)
1333 e23881ed Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1334 e23881ed Michael Hanselmann
      self.rapi.AddResponse("30783")
1335 e23881ed Michael Hanselmann
      self.assertEqual(30783,
1336 e23881ed Michael Hanselmann
        self.client.GrowInstanceDisk("eze8ch", idx, amount,
1337 e23881ed Michael Hanselmann
                                     wait_for_sync=wait_for_sync))
1338 e23881ed Michael Hanselmann
      self.assertHandler(rlib2.R_2_instances_name_disk_grow)
1339 e23881ed Michael Hanselmann
      self.assertItems(["eze8ch", str(idx)])
1340 e23881ed Michael Hanselmann
      data = serializer.LoadJson(self.rapi.GetLastRequestData())
1341 e23881ed Michael Hanselmann
      if wait_for_sync is None:
1342 e23881ed Michael Hanselmann
        self.assertEqual(len(data), 1)
1343 e23881ed Michael Hanselmann
        self.assert_("wait_for_sync" not in data)
1344 e23881ed Michael Hanselmann
      else:
1345 e23881ed Michael Hanselmann
        self.assertEqual(len(data), 2)
1346 e23881ed Michael Hanselmann
        self.assertEqual(data["wait_for_sync"], wait_for_sync)
1347 e23881ed Michael Hanselmann
      self.assertEqual(data["amount"], amount)
1348 e23881ed Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1349 e23881ed Michael Hanselmann
1350 414ebaf1 Michael Hanselmann
  def testGetGroupTags(self):
1351 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("[]")
1352 414ebaf1 Michael Hanselmann
    self.assertEqual([], self.client.GetGroupTags("fooGroup"))
1353 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1354 414ebaf1 Michael Hanselmann
    self.assertItems(["fooGroup"])
1355 414ebaf1 Michael Hanselmann
1356 414ebaf1 Michael Hanselmann
  def testAddGroupTags(self):
1357 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("1234")
1358 414ebaf1 Michael Hanselmann
    self.assertEqual(1234,
1359 414ebaf1 Michael Hanselmann
        self.client.AddGroupTags("fooGroup", ["awesome"], dry_run=True))
1360 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1361 414ebaf1 Michael Hanselmann
    self.assertItems(["fooGroup"])
1362 414ebaf1 Michael Hanselmann
    self.assertDryRun()
1363 414ebaf1 Michael Hanselmann
    self.assertQuery("tag", ["awesome"])
1364 414ebaf1 Michael Hanselmann
1365 414ebaf1 Michael Hanselmann
  def testDeleteGroupTags(self):
1366 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("25826")
1367 414ebaf1 Michael Hanselmann
    self.assertEqual(25826, self.client.DeleteGroupTags("foo", ["awesome"],
1368 414ebaf1 Michael Hanselmann
                                                        dry_run=True))
1369 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1370 414ebaf1 Michael Hanselmann
    self.assertItems(["foo"])
1371 414ebaf1 Michael Hanselmann
    self.assertDryRun()
1372 414ebaf1 Michael Hanselmann
    self.assertQuery("tag", ["awesome"])
1373 414ebaf1 Michael Hanselmann
1374 208a6cff Michael Hanselmann
  def testQuery(self):
1375 208a6cff Michael Hanselmann
    for idx, what in enumerate(constants.QR_VIA_RAPI):
1376 2e5c33db Iustin Pop
      for idx2, qfilter in enumerate([None, ["?", "name"]]):
1377 208a6cff Michael Hanselmann
        job_id = 11010 + (idx << 4) + (idx2 << 16)
1378 208a6cff Michael Hanselmann
        fields = sorted(query.ALL_FIELDS[what].keys())[:10]
1379 208a6cff Michael Hanselmann
1380 208a6cff Michael Hanselmann
        self.rapi.AddResponse(str(job_id))
1381 2e5c33db Iustin Pop
        self.assertEqual(self.client.Query(what, fields, qfilter=qfilter),
1382 208a6cff Michael Hanselmann
                         job_id)
1383 208a6cff Michael Hanselmann
        self.assertItems([what])
1384 208a6cff Michael Hanselmann
        self.assertHandler(rlib2.R_2_query)
1385 208a6cff Michael Hanselmann
        self.assertFalse(self.rapi.GetLastHandler().queryargs)
1386 208a6cff Michael Hanselmann
        data = serializer.LoadJson(self.rapi.GetLastRequestData())
1387 208a6cff Michael Hanselmann
        self.assertEqual(data["fields"], fields)
1388 2e5c33db Iustin Pop
        if qfilter is None:
1389 2e5c33db Iustin Pop
          self.assertTrue("qfilter" not in data)
1390 208a6cff Michael Hanselmann
        else:
1391 2e5c33db Iustin Pop
          self.assertEqual(data["qfilter"], qfilter)
1392 208a6cff Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1393 208a6cff Michael Hanselmann
1394 208a6cff Michael Hanselmann
  def testQueryFields(self):
1395 208a6cff Michael Hanselmann
    exp_result = objects.QueryFieldsResponse(fields=[
1396 208a6cff Michael Hanselmann
      objects.QueryFieldDefinition(name="pnode", title="PNode",
1397 208a6cff Michael Hanselmann
                                   kind=constants.QFT_NUMBER),
1398 208a6cff Michael Hanselmann
      objects.QueryFieldDefinition(name="other", title="Other",
1399 208a6cff Michael Hanselmann
                                   kind=constants.QFT_BOOL),
1400 208a6cff Michael Hanselmann
      ])
1401 208a6cff Michael Hanselmann
1402 208a6cff Michael Hanselmann
    for what in constants.QR_VIA_RAPI:
1403 208a6cff Michael Hanselmann
      for fields in [None, ["name", "_unknown_"], ["&", "?|"]]:
1404 208a6cff Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson(exp_result.ToDict()))
1405 208a6cff Michael Hanselmann
        result = self.client.QueryFields(what, fields=fields)
1406 208a6cff Michael Hanselmann
        self.assertItems([what])
1407 208a6cff Michael Hanselmann
        self.assertHandler(rlib2.R_2_query_fields)
1408 208a6cff Michael Hanselmann
        self.assertFalse(self.rapi.GetLastRequestData())
1409 208a6cff Michael Hanselmann
1410 208a6cff Michael Hanselmann
        queryargs = self.rapi.GetLastHandler().queryargs
1411 208a6cff Michael Hanselmann
        if fields is None:
1412 208a6cff Michael Hanselmann
          self.assertFalse(queryargs)
1413 208a6cff Michael Hanselmann
        else:
1414 208a6cff Michael Hanselmann
          self.assertEqual(queryargs, {
1415 208a6cff Michael Hanselmann
            "fields": [",".join(fields)],
1416 208a6cff Michael Hanselmann
            })
1417 208a6cff Michael Hanselmann
1418 208a6cff Michael Hanselmann
        self.assertEqual(objects.QueryFieldsResponse.FromDict(result).ToDict(),
1419 208a6cff Michael Hanselmann
                         exp_result.ToDict())
1420 208a6cff Michael Hanselmann
1421 208a6cff Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1422 208a6cff Michael Hanselmann
1423 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionNoChange(self):
1424 dde0e97c Michael Hanselmann
    resp = serializer.DumpJson({
1425 47099cd1 Michael Hanselmann
      "status": constants.JOB_STATUS_WAITING,
1426 dde0e97c Michael Hanselmann
      })
1427 dde0e97c Michael Hanselmann
1428 dde0e97c Michael Hanselmann
    for retries in [1, 5, 25]:
1429 dde0e97c Michael Hanselmann
      for _ in range(retries):
1430 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(resp)
1431 dde0e97c Michael Hanselmann
1432 dde0e97c Michael Hanselmann
      self.assertFalse(self.client.WaitForJobCompletion(22789, period=None,
1433 dde0e97c Michael Hanselmann
                                                        retries=retries))
1434 dde0e97c Michael Hanselmann
      self.assertHandler(rlib2.R_2_jobs_id)
1435 dde0e97c Michael Hanselmann
      self.assertItems(["22789"])
1436 dde0e97c Michael Hanselmann
1437 dde0e97c Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1438 dde0e97c Michael Hanselmann
1439 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionAlreadyFinished(self):
1440 dde0e97c Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson({
1441 dde0e97c Michael Hanselmann
      "status": constants.JOB_STATUS_SUCCESS,
1442 dde0e97c Michael Hanselmann
      }))
1443 dde0e97c Michael Hanselmann
1444 dde0e97c Michael Hanselmann
    self.assertTrue(self.client.WaitForJobCompletion(22793, period=None,
1445 dde0e97c Michael Hanselmann
                                                     retries=1))
1446 dde0e97c Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id)
1447 dde0e97c Michael Hanselmann
    self.assertItems(["22793"])
1448 dde0e97c Michael Hanselmann
1449 dde0e97c Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1450 dde0e97c Michael Hanselmann
1451 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionEmptyResponse(self):
1452 dde0e97c Michael Hanselmann
    self.rapi.AddResponse("{}")
1453 dde0e97c Michael Hanselmann
    self.assertFalse(self.client.WaitForJobCompletion(22793, period=None,
1454 dde0e97c Michael Hanselmann
                                                     retries=10))
1455 dde0e97c Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id)
1456 dde0e97c Michael Hanselmann
    self.assertItems(["22793"])
1457 dde0e97c Michael Hanselmann
1458 dde0e97c Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1459 dde0e97c Michael Hanselmann
1460 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionOutOfRetries(self):
1461 dde0e97c Michael Hanselmann
    for retries in [3, 10, 21]:
1462 dde0e97c Michael Hanselmann
      for _ in range(retries):
1463 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson({
1464 dde0e97c Michael Hanselmann
          "status": constants.JOB_STATUS_RUNNING,
1465 dde0e97c Michael Hanselmann
          }))
1466 dde0e97c Michael Hanselmann
1467 dde0e97c Michael Hanselmann
      self.assertFalse(self.client.WaitForJobCompletion(30948, period=None,
1468 dde0e97c Michael Hanselmann
                                                        retries=retries - 1))
1469 dde0e97c Michael Hanselmann
      self.assertHandler(rlib2.R_2_jobs_id)
1470 dde0e97c Michael Hanselmann
      self.assertItems(["30948"])
1471 dde0e97c Michael Hanselmann
1472 dde0e97c Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 1)
1473 dde0e97c Michael Hanselmann
      self.rapi.ResetResponses()
1474 dde0e97c Michael Hanselmann
1475 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionSuccessAndFailure(self):
1476 dde0e97c Michael Hanselmann
    for retries in [1, 4, 13]:
1477 dde0e97c Michael Hanselmann
      for (success, end_status) in [(False, constants.JOB_STATUS_ERROR),
1478 dde0e97c Michael Hanselmann
                                    (True, constants.JOB_STATUS_SUCCESS)]:
1479 dde0e97c Michael Hanselmann
        for _ in range(retries):
1480 dde0e97c Michael Hanselmann
          self.rapi.AddResponse(serializer.DumpJson({
1481 dde0e97c Michael Hanselmann
            "status": constants.JOB_STATUS_RUNNING,
1482 dde0e97c Michael Hanselmann
            }))
1483 dde0e97c Michael Hanselmann
1484 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson({
1485 dde0e97c Michael Hanselmann
          "status": end_status,
1486 dde0e97c Michael Hanselmann
          }))
1487 dde0e97c Michael Hanselmann
1488 dde0e97c Michael Hanselmann
        result = self.client.WaitForJobCompletion(3187, period=None,
1489 dde0e97c Michael Hanselmann
                                                  retries=retries + 1)
1490 dde0e97c Michael Hanselmann
        self.assertEqual(result, success)
1491 dde0e97c Michael Hanselmann
        self.assertHandler(rlib2.R_2_jobs_id)
1492 dde0e97c Michael Hanselmann
        self.assertItems(["3187"])
1493 dde0e97c Michael Hanselmann
1494 dde0e97c Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1495 dde0e97c Michael Hanselmann
1496 95ab4de9 David Knowles
1497 70b0d2a2 Michael Hanselmann
class RapiTestRunner(unittest.TextTestRunner):
1498 70b0d2a2 Michael Hanselmann
  def run(self, *args):
1499 70b0d2a2 Michael Hanselmann
    global _used_handlers
1500 70b0d2a2 Michael Hanselmann
    assert _used_handlers is None
1501 70b0d2a2 Michael Hanselmann
1502 70b0d2a2 Michael Hanselmann
    _used_handlers = set()
1503 70b0d2a2 Michael Hanselmann
    try:
1504 70b0d2a2 Michael Hanselmann
      # Run actual tests
1505 70b0d2a2 Michael Hanselmann
      result = unittest.TextTestRunner.run(self, *args)
1506 70b0d2a2 Michael Hanselmann
1507 70b0d2a2 Michael Hanselmann
      diff = (set(connector.CONNECTOR.values()) - _used_handlers -
1508 70b0d2a2 Michael Hanselmann
             _KNOWN_UNUSED)
1509 70b0d2a2 Michael Hanselmann
      if diff:
1510 70b0d2a2 Michael Hanselmann
        raise AssertionError("The following RAPI resources were not used by the"
1511 70b0d2a2 Michael Hanselmann
                             " RAPI client: %r" % utils.CommaJoin(diff))
1512 70b0d2a2 Michael Hanselmann
    finally:
1513 70b0d2a2 Michael Hanselmann
      # Reset global variable
1514 70b0d2a2 Michael Hanselmann
      _used_handlers = None
1515 70b0d2a2 Michael Hanselmann
1516 70b0d2a2 Michael Hanselmann
    return result
1517 70b0d2a2 Michael Hanselmann
1518 70b0d2a2 Michael Hanselmann
1519 2f96c43c Michael Hanselmann
if __name__ == "__main__":
1520 70b0d2a2 Michael Hanselmann
  client.UsesRapiClient(testutils.GanetiTestProgram)(testRunner=RapiTestRunner)