Statistics
| Branch: | Tag: | Revision:

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

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 70b0d2a2 Michael Hanselmann
  connector.R_root,
49 70b0d2a2 Michael Hanselmann
  connector.R_2,
50 70b0d2a2 Michael Hanselmann
  ])
51 70b0d2a2 Michael Hanselmann
52 70b0d2a2 Michael Hanselmann
# Global variable for collecting used handlers
53 70b0d2a2 Michael Hanselmann
_used_handlers = None
54 70b0d2a2 Michael Hanselmann
55 95ab4de9 David Knowles
56 95ab4de9 David Knowles
def _GetPathFromUri(uri):
57 95ab4de9 David Knowles
  """Gets the path and query from a URI.
58 95ab4de9 David Knowles

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