Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rapi.client_unittest.py @ 414ebaf1

History | View | Annotate | Download (45.8 kB)

1 95ab4de9 David Knowles
#!/usr/bin/python
2 95ab4de9 David Knowles
#
3 95ab4de9 David Knowles
4 95ab4de9 David Knowles
# Copyright (C) 2010 Google Inc.
5 95ab4de9 David Knowles
#
6 95ab4de9 David Knowles
# This program is free software; you can redistribute it and/or modify
7 95ab4de9 David Knowles
# it under the terms of the GNU General Public License as published by
8 95ab4de9 David Knowles
# the Free Software Foundation; either version 2 of the License, or
9 95ab4de9 David Knowles
# (at your option) any later version.
10 95ab4de9 David Knowles
#
11 95ab4de9 David Knowles
# This program is distributed in the hope that it will be useful, but
12 95ab4de9 David Knowles
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 95ab4de9 David Knowles
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 95ab4de9 David Knowles
# General Public License for more details.
15 95ab4de9 David Knowles
#
16 95ab4de9 David Knowles
# You should have received a copy of the GNU General Public License
17 95ab4de9 David Knowles
# along with this program; if not, write to the Free Software
18 95ab4de9 David Knowles
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 95ab4de9 David Knowles
# 02110-1301, USA.
20 95ab4de9 David Knowles
21 95ab4de9 David Knowles
22 95ab4de9 David Knowles
"""Script for unittesting the RAPI client module"""
23 95ab4de9 David Knowles
24 95ab4de9 David Knowles
25 95ab4de9 David Knowles
import re
26 95ab4de9 David Knowles
import unittest
27 95ab4de9 David Knowles
import warnings
28 2a7c3583 Michael Hanselmann
import pycurl
29 95ab4de9 David Knowles
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 95ab4de9 David Knowles
37 95ab4de9 David Knowles
from ganeti.rapi import connector
38 95ab4de9 David Knowles
from ganeti.rapi import rlib2
39 9279e986 Michael Hanselmann
from ganeti.rapi import client
40 95ab4de9 David Knowles
41 95ab4de9 David Knowles
import testutils
42 95ab4de9 David Knowles
43 95ab4de9 David Knowles
44 95ab4de9 David Knowles
_URI_RE = re.compile(r"https://(?P<host>.*):(?P<port>\d+)(?P<path>/.*)")
45 95ab4de9 David Knowles
46 70b0d2a2 Michael Hanselmann
# List of resource handlers which aren't used by the RAPI client
47 70b0d2a2 Michael Hanselmann
_KNOWN_UNUSED = set([
48 70b0d2a2 Michael Hanselmann
  connector.R_root,
49 70b0d2a2 Michael Hanselmann
  connector.R_2,
50 70b0d2a2 Michael Hanselmann
  ])
51 70b0d2a2 Michael Hanselmann
52 70b0d2a2 Michael Hanselmann
# Global variable for collecting used handlers
53 70b0d2a2 Michael Hanselmann
_used_handlers = None
54 70b0d2a2 Michael Hanselmann
55 95ab4de9 David Knowles
56 95ab4de9 David Knowles
def _GetPathFromUri(uri):
57 95ab4de9 David Knowles
  """Gets the path and query from a URI.
58 95ab4de9 David Knowles

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