Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rapi.client_unittest.py @ 4fdedd09

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