Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rapi.client_unittest.py @ 42d4d8b9

History | View | Annotate | Download (51.5 kB)

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