Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (51.1 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 95ab4de9 David Knowles
  def testGetNodeStorageUnits(self):
977 95ab4de9 David Knowles
    self.rapi.AddResponse("42")
978 95ab4de9 David Knowles
    self.assertEqual(42,
979 95ab4de9 David Knowles
        self.client.GetNodeStorageUnits("node-x", "lvm-pv", "fields"))
980 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage)
981 95ab4de9 David Knowles
    self.assertItems(["node-x"])
982 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
983 95ab4de9 David Knowles
    self.assertQuery("output_fields", ["fields"])
984 95ab4de9 David Knowles
985 95ab4de9 David Knowles
  def testModifyNodeStorageUnits(self):
986 95ab4de9 David Knowles
    self.rapi.AddResponse("14")
987 95ab4de9 David Knowles
    self.assertEqual(14,
988 95ab4de9 David Knowles
        self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda"))
989 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
990 95ab4de9 David Knowles
    self.assertItems(["node-z"])
991 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
992 95ab4de9 David Knowles
    self.assertQuery("name", ["hda"])
993 fde28316 Michael Hanselmann
    self.assertQuery("allocatable", None)
994 fde28316 Michael Hanselmann
995 fde28316 Michael Hanselmann
    for allocatable, query_allocatable in [(True, "1"), (False, "0")]:
996 fde28316 Michael Hanselmann
      self.rapi.AddResponse("7205")
997 fde28316 Michael Hanselmann
      job_id = self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda",
998 fde28316 Michael Hanselmann
                                                  allocatable=allocatable)
999 fde28316 Michael Hanselmann
      self.assertEqual(7205, job_id)
1000 fde28316 Michael Hanselmann
      self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
1001 fde28316 Michael Hanselmann
      self.assertItems(["node-z"])
1002 fde28316 Michael Hanselmann
      self.assertQuery("storage_type", ["lvm-pv"])
1003 fde28316 Michael Hanselmann
      self.assertQuery("name", ["hda"])
1004 fde28316 Michael Hanselmann
      self.assertQuery("allocatable", [query_allocatable])
1005 95ab4de9 David Knowles
1006 752df8bb Michael Hanselmann
  def testRepairNodeStorageUnits(self):
1007 752df8bb Michael Hanselmann
    self.rapi.AddResponse("99")
1008 752df8bb Michael Hanselmann
    self.assertEqual(99, self.client.RepairNodeStorageUnits("node-z", "lvm-pv",
1009 752df8bb Michael Hanselmann
                                                            "hda"))
1010 752df8bb Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_storage_repair)
1011 752df8bb Michael Hanselmann
    self.assertItems(["node-z"])
1012 752df8bb Michael Hanselmann
    self.assertQuery("storage_type", ["lvm-pv"])
1013 752df8bb Michael Hanselmann
    self.assertQuery("name", ["hda"])
1014 752df8bb Michael Hanselmann
1015 95ab4de9 David Knowles
  def testGetNodeTags(self):
1016 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"fry\", \"bender\"]")
1017 95ab4de9 David Knowles
    self.assertEqual(["fry", "bender"], self.client.GetNodeTags("node-k"))
1018 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1019 95ab4de9 David Knowles
    self.assertItems(["node-k"])
1020 95ab4de9 David Knowles
1021 95ab4de9 David Knowles
  def testAddNodeTags(self):
1022 cab667cc David Knowles
    self.rapi.AddResponse("1234")
1023 cab667cc David Knowles
    self.assertEqual(1234,
1024 cab667cc David Knowles
        self.client.AddNodeTags("node-v", ["awesome"], dry_run=True))
1025 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1026 95ab4de9 David Knowles
    self.assertItems(["node-v"])
1027 95ab4de9 David Knowles
    self.assertDryRun()
1028 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
1029 95ab4de9 David Knowles
1030 95ab4de9 David Knowles
  def testDeleteNodeTags(self):
1031 cd577680 Michael Hanselmann
    self.rapi.AddResponse("16861")
1032 cd577680 Michael Hanselmann
    self.assertEqual(16861, self.client.DeleteNodeTags("node-w", ["awesome"],
1033 cd577680 Michael Hanselmann
                                                       dry_run=True))
1034 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
1035 95ab4de9 David Knowles
    self.assertItems(["node-w"])
1036 95ab4de9 David Knowles
    self.assertDryRun()
1037 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
1038 95ab4de9 David Knowles
1039 a268af8d Adeodato Simo
  def testGetGroups(self):
1040 a268af8d Adeodato Simo
    groups = [{"name": "group1",
1041 a268af8d Adeodato Simo
               "uri": "/2/groups/group1",
1042 a268af8d Adeodato Simo
               },
1043 a268af8d Adeodato Simo
              {"name": "group2",
1044 a268af8d Adeodato Simo
               "uri": "/2/groups/group2",
1045 a268af8d Adeodato Simo
               },
1046 a268af8d Adeodato Simo
              ]
1047 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(groups))
1048 a268af8d Adeodato Simo
    self.assertEqual(["group1", "group2"], self.client.GetGroups())
1049 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1050 a268af8d Adeodato Simo
1051 a268af8d Adeodato Simo
  def testGetGroupsBulk(self):
1052 a268af8d Adeodato Simo
    groups = [{"name": "group1",
1053 a268af8d Adeodato Simo
               "uri": "/2/groups/group1",
1054 a268af8d Adeodato Simo
               "node_cnt": 2,
1055 a268af8d Adeodato Simo
               "node_list": ["gnt1.test",
1056 a268af8d Adeodato Simo
                             "gnt2.test",
1057 a268af8d Adeodato Simo
                             ],
1058 a268af8d Adeodato Simo
               },
1059 a268af8d Adeodato Simo
              {"name": "group2",
1060 a268af8d Adeodato Simo
               "uri": "/2/groups/group2",
1061 a268af8d Adeodato Simo
               "node_cnt": 1,
1062 a268af8d Adeodato Simo
               "node_list": ["gnt3.test",
1063 a268af8d Adeodato Simo
                             ],
1064 a268af8d Adeodato Simo
               },
1065 a268af8d Adeodato Simo
              ]
1066 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(groups))
1067 a268af8d Adeodato Simo
1068 a268af8d Adeodato Simo
    self.assertEqual(groups, self.client.GetGroups(bulk=True))
1069 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1070 a268af8d Adeodato Simo
    self.assertBulk()
1071 a268af8d Adeodato Simo
1072 a268af8d Adeodato Simo
  def testGetGroup(self):
1073 a268af8d Adeodato Simo
    group = {"ctime": None,
1074 a268af8d Adeodato Simo
             "name": "default",
1075 a268af8d Adeodato Simo
             }
1076 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(group))
1077 a268af8d Adeodato Simo
    self.assertEqual({"ctime": None, "name": "default"},
1078 a268af8d Adeodato Simo
                     self.client.GetGroup("default"))
1079 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name)
1080 a268af8d Adeodato Simo
    self.assertItems(["default"])
1081 a268af8d Adeodato Simo
1082 a268af8d Adeodato Simo
  def testCreateGroup(self):
1083 a268af8d Adeodato Simo
    self.rapi.AddResponse("12345")
1084 a268af8d Adeodato Simo
    job_id = self.client.CreateGroup("newgroup", dry_run=True)
1085 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12345)
1086 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1087 a268af8d Adeodato Simo
    self.assertDryRun()
1088 a268af8d Adeodato Simo
1089 a268af8d Adeodato Simo
  def testDeleteGroup(self):
1090 a268af8d Adeodato Simo
    self.rapi.AddResponse("12346")
1091 a268af8d Adeodato Simo
    job_id = self.client.DeleteGroup("newgroup", dry_run=True)
1092 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12346)
1093 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name)
1094 a268af8d Adeodato Simo
    self.assertDryRun()
1095 a268af8d Adeodato Simo
1096 a268af8d Adeodato Simo
  def testRenameGroup(self):
1097 a268af8d Adeodato Simo
    self.rapi.AddResponse("12347")
1098 a268af8d Adeodato Simo
    job_id = self.client.RenameGroup("oldname", "newname")
1099 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12347)
1100 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_rename)
1101 a268af8d Adeodato Simo
1102 7187e6ff Adeodato Simo
  def testModifyGroup(self):
1103 7187e6ff Adeodato Simo
    self.rapi.AddResponse("12348")
1104 7187e6ff Adeodato Simo
    job_id = self.client.ModifyGroup("mygroup", alloc_policy="foo")
1105 7187e6ff Adeodato Simo
    self.assertEqual(job_id, 12348)
1106 7187e6ff Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_modify)
1107 7187e6ff Adeodato Simo
1108 4245446f Adeodato Simo
  def testAssignGroupNodes(self):
1109 4245446f Adeodato Simo
    self.rapi.AddResponse("12349")
1110 4245446f Adeodato Simo
    job_id = self.client.AssignGroupNodes("mygroup", ["node1", "node2"],
1111 4245446f Adeodato Simo
                                          force=True, dry_run=True)
1112 4245446f Adeodato Simo
    self.assertEqual(job_id, 12349)
1113 4245446f Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_assign_nodes)
1114 4245446f Adeodato Simo
    self.assertDryRun()
1115 4245446f Adeodato Simo
    self.assertUseForce()
1116 4245446f Adeodato Simo
1117 08c11c40 Michael Hanselmann
  def testModifyInstance(self):
1118 08c11c40 Michael Hanselmann
    self.rapi.AddResponse("23681")
1119 08c11c40 Michael Hanselmann
    job_id = self.client.ModifyInstance("inst7210", os_name="linux")
1120 08c11c40 Michael Hanselmann
    self.assertEqual(job_id, 23681)
1121 08c11c40 Michael Hanselmann
    self.assertItems(["inst7210"])
1122 08c11c40 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_modify)
1123 08c11c40 Michael Hanselmann
    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
1124 08c11c40 Michael Hanselmann
                     { "os_name": "linux", })
1125 08c11c40 Michael Hanselmann
1126 62e999a5 Michael Hanselmann
  def testModifyCluster(self):
1127 62e999a5 Michael Hanselmann
    for mnh in [None, False, True]:
1128 62e999a5 Michael Hanselmann
      self.rapi.AddResponse("14470")
1129 62e999a5 Michael Hanselmann
      self.assertEqual(14470,
1130 62e999a5 Michael Hanselmann
        self.client.ModifyCluster(maintain_node_health=mnh))
1131 62e999a5 Michael Hanselmann
      self.assertHandler(rlib2.R_2_cluster_modify)
1132 62e999a5 Michael Hanselmann
      self.assertItems([])
1133 62e999a5 Michael Hanselmann
      data = serializer.LoadJson(self.rapi.GetLastRequestData())
1134 62e999a5 Michael Hanselmann
      self.assertEqual(len(data), 1)
1135 62e999a5 Michael Hanselmann
      self.assertEqual(data["maintain_node_health"], mnh)
1136 62e999a5 Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1137 62e999a5 Michael Hanselmann
1138 54d4c13b Michael Hanselmann
  def testRedistributeConfig(self):
1139 54d4c13b Michael Hanselmann
    self.rapi.AddResponse("3364")
1140 54d4c13b Michael Hanselmann
    job_id = self.client.RedistributeConfig()
1141 54d4c13b Michael Hanselmann
    self.assertEqual(job_id, 3364)
1142 54d4c13b Michael Hanselmann
    self.assertItems([])
1143 54d4c13b Michael Hanselmann
    self.assertHandler(rlib2.R_2_redist_config)
1144 54d4c13b Michael Hanselmann
1145 b680c8be Michael Hanselmann
  def testActivateInstanceDisks(self):
1146 b680c8be Michael Hanselmann
    self.rapi.AddResponse("23547")
1147 b680c8be Michael Hanselmann
    job_id = self.client.ActivateInstanceDisks("inst28204")
1148 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 23547)
1149 b680c8be Michael Hanselmann
    self.assertItems(["inst28204"])
1150 b680c8be Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_activate_disks)
1151 b680c8be Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1152 b680c8be Michael Hanselmann
1153 b680c8be Michael Hanselmann
  def testActivateInstanceDisksIgnoreSize(self):
1154 b680c8be Michael Hanselmann
    self.rapi.AddResponse("11044")
1155 b680c8be Michael Hanselmann
    job_id = self.client.ActivateInstanceDisks("inst28204", ignore_size=True)
1156 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 11044)
1157 b680c8be Michael Hanselmann
    self.assertItems(["inst28204"])
1158 b680c8be Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_activate_disks)
1159 b680c8be Michael Hanselmann
    self.assertQuery("ignore_size", ["1"])
1160 b680c8be Michael Hanselmann
1161 b680c8be Michael Hanselmann
  def testDeactivateInstanceDisks(self):
1162 b680c8be Michael Hanselmann
    self.rapi.AddResponse("14591")
1163 b680c8be Michael Hanselmann
    job_id = self.client.DeactivateInstanceDisks("inst28234")
1164 b680c8be Michael Hanselmann
    self.assertEqual(job_id, 14591)
1165 b680c8be Michael Hanselmann
    self.assertItems(["inst28234"])
1166 b680c8be Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_deactivate_disks)
1167 b680c8be Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1168 b680c8be Michael Hanselmann
1169 a52978c7 Michael Hanselmann
  def testRecreateInstanceDisks(self):
1170 a52978c7 Michael Hanselmann
    self.rapi.AddResponse("13553")
1171 a52978c7 Michael Hanselmann
    job_id = self.client.RecreateInstanceDisks("inst23153")
1172 a52978c7 Michael Hanselmann
    self.assertEqual(job_id, 13553)
1173 a52978c7 Michael Hanselmann
    self.assertItems(["inst23153"])
1174 a52978c7 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_recreate_disks)
1175 a52978c7 Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1176 a52978c7 Michael Hanselmann
1177 b82d4c5e Michael Hanselmann
  def testGetInstanceConsole(self):
1178 b82d4c5e Michael Hanselmann
    self.rapi.AddResponse("26876")
1179 b82d4c5e Michael Hanselmann
    job_id = self.client.GetInstanceConsole("inst21491")
1180 b82d4c5e Michael Hanselmann
    self.assertEqual(job_id, 26876)
1181 b82d4c5e Michael Hanselmann
    self.assertItems(["inst21491"])
1182 b82d4c5e Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_console)
1183 b82d4c5e Michael Hanselmann
    self.assertFalse(self.rapi.GetLastHandler().queryargs)
1184 b82d4c5e Michael Hanselmann
    self.assertFalse(self.rapi.GetLastRequestData())
1185 b82d4c5e Michael Hanselmann
1186 e23881ed Michael Hanselmann
  def testGrowInstanceDisk(self):
1187 e23881ed Michael Hanselmann
    for idx, wait_for_sync in enumerate([None, False, True]):
1188 e23881ed Michael Hanselmann
      amount = 128 + (512 * idx)
1189 e23881ed Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1190 e23881ed Michael Hanselmann
      self.rapi.AddResponse("30783")
1191 e23881ed Michael Hanselmann
      self.assertEqual(30783,
1192 e23881ed Michael Hanselmann
        self.client.GrowInstanceDisk("eze8ch", idx, amount,
1193 e23881ed Michael Hanselmann
                                     wait_for_sync=wait_for_sync))
1194 e23881ed Michael Hanselmann
      self.assertHandler(rlib2.R_2_instances_name_disk_grow)
1195 e23881ed Michael Hanselmann
      self.assertItems(["eze8ch", str(idx)])
1196 e23881ed Michael Hanselmann
      data = serializer.LoadJson(self.rapi.GetLastRequestData())
1197 e23881ed Michael Hanselmann
      if wait_for_sync is None:
1198 e23881ed Michael Hanselmann
        self.assertEqual(len(data), 1)
1199 e23881ed Michael Hanselmann
        self.assert_("wait_for_sync" not in data)
1200 e23881ed Michael Hanselmann
      else:
1201 e23881ed Michael Hanselmann
        self.assertEqual(len(data), 2)
1202 e23881ed Michael Hanselmann
        self.assertEqual(data["wait_for_sync"], wait_for_sync)
1203 e23881ed Michael Hanselmann
      self.assertEqual(data["amount"], amount)
1204 e23881ed Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1205 e23881ed Michael Hanselmann
1206 414ebaf1 Michael Hanselmann
  def testGetGroupTags(self):
1207 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("[]")
1208 414ebaf1 Michael Hanselmann
    self.assertEqual([], self.client.GetGroupTags("fooGroup"))
1209 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1210 414ebaf1 Michael Hanselmann
    self.assertItems(["fooGroup"])
1211 414ebaf1 Michael Hanselmann
1212 414ebaf1 Michael Hanselmann
  def testAddGroupTags(self):
1213 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("1234")
1214 414ebaf1 Michael Hanselmann
    self.assertEqual(1234,
1215 414ebaf1 Michael Hanselmann
        self.client.AddGroupTags("fooGroup", ["awesome"], dry_run=True))
1216 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1217 414ebaf1 Michael Hanselmann
    self.assertItems(["fooGroup"])
1218 414ebaf1 Michael Hanselmann
    self.assertDryRun()
1219 414ebaf1 Michael Hanselmann
    self.assertQuery("tag", ["awesome"])
1220 414ebaf1 Michael Hanselmann
1221 414ebaf1 Michael Hanselmann
  def testDeleteGroupTags(self):
1222 414ebaf1 Michael Hanselmann
    self.rapi.AddResponse("25826")
1223 414ebaf1 Michael Hanselmann
    self.assertEqual(25826, self.client.DeleteGroupTags("foo", ["awesome"],
1224 414ebaf1 Michael Hanselmann
                                                        dry_run=True))
1225 414ebaf1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_groups_name_tags)
1226 414ebaf1 Michael Hanselmann
    self.assertItems(["foo"])
1227 414ebaf1 Michael Hanselmann
    self.assertDryRun()
1228 414ebaf1 Michael Hanselmann
    self.assertQuery("tag", ["awesome"])
1229 414ebaf1 Michael Hanselmann
1230 208a6cff Michael Hanselmann
  def testQuery(self):
1231 208a6cff Michael Hanselmann
    for idx, what in enumerate(constants.QR_VIA_RAPI):
1232 208a6cff Michael Hanselmann
      for idx2, filter_ in enumerate([None, ["?", "name"]]):
1233 208a6cff Michael Hanselmann
        job_id = 11010 + (idx << 4) + (idx2 << 16)
1234 208a6cff Michael Hanselmann
        fields = sorted(query.ALL_FIELDS[what].keys())[:10]
1235 208a6cff Michael Hanselmann
1236 208a6cff Michael Hanselmann
        self.rapi.AddResponse(str(job_id))
1237 208a6cff Michael Hanselmann
        self.assertEqual(self.client.Query(what, fields, filter_=filter_),
1238 208a6cff Michael Hanselmann
                         job_id)
1239 208a6cff Michael Hanselmann
        self.assertItems([what])
1240 208a6cff Michael Hanselmann
        self.assertHandler(rlib2.R_2_query)
1241 208a6cff Michael Hanselmann
        self.assertFalse(self.rapi.GetLastHandler().queryargs)
1242 208a6cff Michael Hanselmann
        data = serializer.LoadJson(self.rapi.GetLastRequestData())
1243 208a6cff Michael Hanselmann
        self.assertEqual(data["fields"], fields)
1244 208a6cff Michael Hanselmann
        if filter_ is None:
1245 208a6cff Michael Hanselmann
          self.assertTrue("filter" not in data)
1246 208a6cff Michael Hanselmann
        else:
1247 208a6cff Michael Hanselmann
          self.assertEqual(data["filter"], filter_)
1248 208a6cff Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1249 208a6cff Michael Hanselmann
1250 208a6cff Michael Hanselmann
  def testQueryFields(self):
1251 208a6cff Michael Hanselmann
    exp_result = objects.QueryFieldsResponse(fields=[
1252 208a6cff Michael Hanselmann
      objects.QueryFieldDefinition(name="pnode", title="PNode",
1253 208a6cff Michael Hanselmann
                                   kind=constants.QFT_NUMBER),
1254 208a6cff Michael Hanselmann
      objects.QueryFieldDefinition(name="other", title="Other",
1255 208a6cff Michael Hanselmann
                                   kind=constants.QFT_BOOL),
1256 208a6cff Michael Hanselmann
      ])
1257 208a6cff Michael Hanselmann
1258 208a6cff Michael Hanselmann
    for what in constants.QR_VIA_RAPI:
1259 208a6cff Michael Hanselmann
      for fields in [None, ["name", "_unknown_"], ["&", "?|"]]:
1260 208a6cff Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson(exp_result.ToDict()))
1261 208a6cff Michael Hanselmann
        result = self.client.QueryFields(what, fields=fields)
1262 208a6cff Michael Hanselmann
        self.assertItems([what])
1263 208a6cff Michael Hanselmann
        self.assertHandler(rlib2.R_2_query_fields)
1264 208a6cff Michael Hanselmann
        self.assertFalse(self.rapi.GetLastRequestData())
1265 208a6cff Michael Hanselmann
1266 208a6cff Michael Hanselmann
        queryargs = self.rapi.GetLastHandler().queryargs
1267 208a6cff Michael Hanselmann
        if fields is None:
1268 208a6cff Michael Hanselmann
          self.assertFalse(queryargs)
1269 208a6cff Michael Hanselmann
        else:
1270 208a6cff Michael Hanselmann
          self.assertEqual(queryargs, {
1271 208a6cff Michael Hanselmann
            "fields": [",".join(fields)],
1272 208a6cff Michael Hanselmann
            })
1273 208a6cff Michael Hanselmann
1274 208a6cff Michael Hanselmann
        self.assertEqual(objects.QueryFieldsResponse.FromDict(result).ToDict(),
1275 208a6cff Michael Hanselmann
                         exp_result.ToDict())
1276 208a6cff Michael Hanselmann
1277 208a6cff Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1278 208a6cff Michael Hanselmann
1279 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionNoChange(self):
1280 dde0e97c Michael Hanselmann
    resp = serializer.DumpJson({
1281 47099cd1 Michael Hanselmann
      "status": constants.JOB_STATUS_WAITING,
1282 dde0e97c Michael Hanselmann
      })
1283 dde0e97c Michael Hanselmann
1284 dde0e97c Michael Hanselmann
    for retries in [1, 5, 25]:
1285 dde0e97c Michael Hanselmann
      for _ in range(retries):
1286 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(resp)
1287 dde0e97c Michael Hanselmann
1288 dde0e97c Michael Hanselmann
      self.assertFalse(self.client.WaitForJobCompletion(22789, period=None,
1289 dde0e97c Michael Hanselmann
                                                        retries=retries))
1290 dde0e97c Michael Hanselmann
      self.assertHandler(rlib2.R_2_jobs_id)
1291 dde0e97c Michael Hanselmann
      self.assertItems(["22789"])
1292 dde0e97c Michael Hanselmann
1293 dde0e97c Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1294 dde0e97c Michael Hanselmann
1295 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionAlreadyFinished(self):
1296 dde0e97c Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson({
1297 dde0e97c Michael Hanselmann
      "status": constants.JOB_STATUS_SUCCESS,
1298 dde0e97c Michael Hanselmann
      }))
1299 dde0e97c Michael Hanselmann
1300 dde0e97c Michael Hanselmann
    self.assertTrue(self.client.WaitForJobCompletion(22793, period=None,
1301 dde0e97c Michael Hanselmann
                                                     retries=1))
1302 dde0e97c Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id)
1303 dde0e97c Michael Hanselmann
    self.assertItems(["22793"])
1304 dde0e97c Michael Hanselmann
1305 dde0e97c Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1306 dde0e97c Michael Hanselmann
1307 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionEmptyResponse(self):
1308 dde0e97c Michael Hanselmann
    self.rapi.AddResponse("{}")
1309 dde0e97c Michael Hanselmann
    self.assertFalse(self.client.WaitForJobCompletion(22793, period=None,
1310 dde0e97c Michael Hanselmann
                                                     retries=10))
1311 dde0e97c Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id)
1312 dde0e97c Michael Hanselmann
    self.assertItems(["22793"])
1313 dde0e97c Michael Hanselmann
1314 dde0e97c Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
1315 dde0e97c Michael Hanselmann
1316 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionOutOfRetries(self):
1317 dde0e97c Michael Hanselmann
    for retries in [3, 10, 21]:
1318 dde0e97c Michael Hanselmann
      for _ in range(retries):
1319 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson({
1320 dde0e97c Michael Hanselmann
          "status": constants.JOB_STATUS_RUNNING,
1321 dde0e97c Michael Hanselmann
          }))
1322 dde0e97c Michael Hanselmann
1323 dde0e97c Michael Hanselmann
      self.assertFalse(self.client.WaitForJobCompletion(30948, period=None,
1324 dde0e97c Michael Hanselmann
                                                        retries=retries - 1))
1325 dde0e97c Michael Hanselmann
      self.assertHandler(rlib2.R_2_jobs_id)
1326 dde0e97c Michael Hanselmann
      self.assertItems(["30948"])
1327 dde0e97c Michael Hanselmann
1328 dde0e97c Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 1)
1329 dde0e97c Michael Hanselmann
      self.rapi.ResetResponses()
1330 dde0e97c Michael Hanselmann
1331 dde0e97c Michael Hanselmann
  def testWaitForJobCompletionSuccessAndFailure(self):
1332 dde0e97c Michael Hanselmann
    for retries in [1, 4, 13]:
1333 dde0e97c Michael Hanselmann
      for (success, end_status) in [(False, constants.JOB_STATUS_ERROR),
1334 dde0e97c Michael Hanselmann
                                    (True, constants.JOB_STATUS_SUCCESS)]:
1335 dde0e97c Michael Hanselmann
        for _ in range(retries):
1336 dde0e97c Michael Hanselmann
          self.rapi.AddResponse(serializer.DumpJson({
1337 dde0e97c Michael Hanselmann
            "status": constants.JOB_STATUS_RUNNING,
1338 dde0e97c Michael Hanselmann
            }))
1339 dde0e97c Michael Hanselmann
1340 dde0e97c Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson({
1341 dde0e97c Michael Hanselmann
          "status": end_status,
1342 dde0e97c Michael Hanselmann
          }))
1343 dde0e97c Michael Hanselmann
1344 dde0e97c Michael Hanselmann
        result = self.client.WaitForJobCompletion(3187, period=None,
1345 dde0e97c Michael Hanselmann
                                                  retries=retries + 1)
1346 dde0e97c Michael Hanselmann
        self.assertEqual(result, success)
1347 dde0e97c Michael Hanselmann
        self.assertHandler(rlib2.R_2_jobs_id)
1348 dde0e97c Michael Hanselmann
        self.assertItems(["3187"])
1349 dde0e97c Michael Hanselmann
1350 dde0e97c Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
1351 dde0e97c Michael Hanselmann
1352 95ab4de9 David Knowles
1353 70b0d2a2 Michael Hanselmann
class RapiTestRunner(unittest.TextTestRunner):
1354 70b0d2a2 Michael Hanselmann
  def run(self, *args):
1355 70b0d2a2 Michael Hanselmann
    global _used_handlers
1356 70b0d2a2 Michael Hanselmann
    assert _used_handlers is None
1357 70b0d2a2 Michael Hanselmann
1358 70b0d2a2 Michael Hanselmann
    _used_handlers = set()
1359 70b0d2a2 Michael Hanselmann
    try:
1360 70b0d2a2 Michael Hanselmann
      # Run actual tests
1361 70b0d2a2 Michael Hanselmann
      result = unittest.TextTestRunner.run(self, *args)
1362 70b0d2a2 Michael Hanselmann
1363 70b0d2a2 Michael Hanselmann
      diff = (set(connector.CONNECTOR.values()) - _used_handlers -
1364 70b0d2a2 Michael Hanselmann
             _KNOWN_UNUSED)
1365 70b0d2a2 Michael Hanselmann
      if diff:
1366 70b0d2a2 Michael Hanselmann
        raise AssertionError("The following RAPI resources were not used by the"
1367 70b0d2a2 Michael Hanselmann
                             " RAPI client: %r" % utils.CommaJoin(diff))
1368 70b0d2a2 Michael Hanselmann
    finally:
1369 70b0d2a2 Michael Hanselmann
      # Reset global variable
1370 70b0d2a2 Michael Hanselmann
      _used_handlers = None
1371 70b0d2a2 Michael Hanselmann
1372 70b0d2a2 Michael Hanselmann
    return result
1373 70b0d2a2 Michael Hanselmann
1374 70b0d2a2 Michael Hanselmann
1375 95ab4de9 David Knowles
if __name__ == '__main__':
1376 70b0d2a2 Michael Hanselmann
  client.UsesRapiClient(testutils.GanetiTestProgram)(testRunner=RapiTestRunner)