Statistics
| Branch: | Tag: | Revision:

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

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