Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rapi.client_unittest.py @ 5e12acfe

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