Statistics
| Branch: | Tag: | Revision:

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

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