Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (52.1 kB)

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