Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (51.2 kB)

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