Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.rapi.client_unittest.py @ 75c866c2

History | View | Annotate | Download (39.9 kB)

1 95ab4de9 David Knowles
#!/usr/bin/python
2 95ab4de9 David Knowles
#
3 95ab4de9 David Knowles
4 95ab4de9 David Knowles
# Copyright (C) 2010 Google Inc.
5 95ab4de9 David Knowles
#
6 95ab4de9 David Knowles
# This program is free software; you can redistribute it and/or modify
7 95ab4de9 David Knowles
# it under the terms of the GNU General Public License as published by
8 95ab4de9 David Knowles
# the Free Software Foundation; either version 2 of the License, or
9 95ab4de9 David Knowles
# (at your option) any later version.
10 95ab4de9 David Knowles
#
11 95ab4de9 David Knowles
# This program is distributed in the hope that it will be useful, but
12 95ab4de9 David Knowles
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 95ab4de9 David Knowles
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 95ab4de9 David Knowles
# General Public License for more details.
15 95ab4de9 David Knowles
#
16 95ab4de9 David Knowles
# You should have received a copy of the GNU General Public License
17 95ab4de9 David Knowles
# along with this program; if not, write to the Free Software
18 95ab4de9 David Knowles
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 95ab4de9 David Knowles
# 02110-1301, USA.
20 95ab4de9 David Knowles
21 95ab4de9 David Knowles
22 95ab4de9 David Knowles
"""Script for unittesting the RAPI client module"""
23 95ab4de9 David Knowles
24 95ab4de9 David Knowles
25 95ab4de9 David Knowles
import re
26 95ab4de9 David Knowles
import unittest
27 95ab4de9 David Knowles
import warnings
28 2a7c3583 Michael Hanselmann
import pycurl
29 95ab4de9 David Knowles
30 2a7c3583 Michael Hanselmann
from ganeti import constants
31 95ab4de9 David Knowles
from ganeti import http
32 d9b67f70 Michael Hanselmann
from ganeti import serializer
33 95ab4de9 David Knowles
34 95ab4de9 David Knowles
from ganeti.rapi import connector
35 95ab4de9 David Knowles
from ganeti.rapi import rlib2
36 9279e986 Michael Hanselmann
from ganeti.rapi import client
37 95ab4de9 David Knowles
38 95ab4de9 David Knowles
import testutils
39 95ab4de9 David Knowles
40 95ab4de9 David Knowles
41 95ab4de9 David Knowles
_URI_RE = re.compile(r"https://(?P<host>.*):(?P<port>\d+)(?P<path>/.*)")
42 95ab4de9 David Knowles
43 95ab4de9 David Knowles
44 95ab4de9 David Knowles
def _GetPathFromUri(uri):
45 95ab4de9 David Knowles
  """Gets the path and query from a URI.
46 95ab4de9 David Knowles

47 95ab4de9 David Knowles
  """
48 95ab4de9 David Knowles
  match = _URI_RE.match(uri)
49 95ab4de9 David Knowles
  if match:
50 95ab4de9 David Knowles
    return match.groupdict()["path"]
51 95ab4de9 David Knowles
  else:
52 95ab4de9 David Knowles
    return None
53 95ab4de9 David Knowles
54 95ab4de9 David Knowles
55 2a7c3583 Michael Hanselmann
class FakeCurl:
56 2a7c3583 Michael Hanselmann
  def __init__(self, rapi):
57 2a7c3583 Michael Hanselmann
    self._rapi = rapi
58 2a7c3583 Michael Hanselmann
    self._opts = {}
59 2a7c3583 Michael Hanselmann
    self._info = {}
60 9279e986 Michael Hanselmann
61 2a7c3583 Michael Hanselmann
  def setopt(self, opt, value):
62 2a7c3583 Michael Hanselmann
    self._opts[opt] = value
63 95ab4de9 David Knowles
64 2a7c3583 Michael Hanselmann
  def getopt(self, opt):
65 2a7c3583 Michael Hanselmann
    return self._opts.get(opt)
66 95ab4de9 David Knowles
67 2a7c3583 Michael Hanselmann
  def unsetopt(self, opt):
68 2a7c3583 Michael Hanselmann
    self._opts.pop(opt, None)
69 95ab4de9 David Knowles
70 2a7c3583 Michael Hanselmann
  def getinfo(self, info):
71 2a7c3583 Michael Hanselmann
    return self._info[info]
72 95ab4de9 David Knowles
73 2a7c3583 Michael Hanselmann
  def perform(self):
74 2a7c3583 Michael Hanselmann
    method = self._opts[pycurl.CUSTOMREQUEST]
75 2a7c3583 Michael Hanselmann
    url = self._opts[pycurl.URL]
76 2a7c3583 Michael Hanselmann
    request_body = self._opts[pycurl.POSTFIELDS]
77 2a7c3583 Michael Hanselmann
    writefn = self._opts[pycurl.WRITEFUNCTION]
78 95ab4de9 David Knowles
79 2a7c3583 Michael Hanselmann
    path = _GetPathFromUri(url)
80 2a7c3583 Michael Hanselmann
    (code, resp_body) = self._rapi.FetchResponse(path, method, request_body)
81 95ab4de9 David Knowles
82 2a7c3583 Michael Hanselmann
    self._info[pycurl.RESPONSE_CODE] = code
83 2a7c3583 Michael Hanselmann
    if resp_body is not None:
84 2a7c3583 Michael Hanselmann
      writefn(resp_body)
85 95ab4de9 David Knowles
86 95ab4de9 David Knowles
87 95ab4de9 David Knowles
class RapiMock(object):
88 95ab4de9 David Knowles
  def __init__(self):
89 95ab4de9 David Knowles
    self._mapper = connector.Mapper()
90 95ab4de9 David Knowles
    self._responses = []
91 95ab4de9 David Knowles
    self._last_handler = None
92 2a7c3583 Michael Hanselmann
    self._last_req_data = None
93 95ab4de9 David Knowles
94 de4f53e6 Michael Hanselmann
  def AddResponse(self, response, code=200):
95 de4f53e6 Michael Hanselmann
    self._responses.insert(0, (code, response))
96 95ab4de9 David Knowles
97 48436b97 Michael Hanselmann
  def CountPending(self):
98 48436b97 Michael Hanselmann
    return len(self._responses)
99 48436b97 Michael Hanselmann
100 95ab4de9 David Knowles
  def GetLastHandler(self):
101 95ab4de9 David Knowles
    return self._last_handler
102 95ab4de9 David Knowles
103 2a7c3583 Michael Hanselmann
  def GetLastRequestData(self):
104 2a7c3583 Michael Hanselmann
    return self._last_req_data
105 2a7c3583 Michael Hanselmann
106 2a7c3583 Michael Hanselmann
  def FetchResponse(self, path, method, request_body):
107 2a7c3583 Michael Hanselmann
    self._last_req_data = request_body
108 2a7c3583 Michael Hanselmann
109 95ab4de9 David Knowles
    try:
110 95ab4de9 David Knowles
      HandlerClass, items, args = self._mapper.getController(path)
111 95ab4de9 David Knowles
      self._last_handler = HandlerClass(items, args, None)
112 95ab4de9 David Knowles
      if not hasattr(self._last_handler, method.upper()):
113 de4f53e6 Michael Hanselmann
        raise http.HttpNotImplemented(message="Method not implemented")
114 de4f53e6 Michael Hanselmann
115 95ab4de9 David Knowles
    except http.HttpException, ex:
116 95ab4de9 David Knowles
      code = ex.code
117 95ab4de9 David Knowles
      response = ex.message
118 de4f53e6 Michael Hanselmann
    else:
119 de4f53e6 Michael Hanselmann
      if not self._responses:
120 de4f53e6 Michael Hanselmann
        raise Exception("No responses")
121 95ab4de9 David Knowles
122 de4f53e6 Michael Hanselmann
      (code, response) = self._responses.pop()
123 95ab4de9 David Knowles
124 95ab4de9 David Knowles
    return code, response
125 95ab4de9 David Knowles
126 95ab4de9 David Knowles
127 2a7c3583 Michael Hanselmann
class TestConstants(unittest.TestCase):
128 2a7c3583 Michael Hanselmann
  def test(self):
129 2a7c3583 Michael Hanselmann
    self.assertEqual(client.GANETI_RAPI_PORT, constants.DEFAULT_RAPI_PORT)
130 2a7c3583 Michael Hanselmann
    self.assertEqual(client.GANETI_RAPI_VERSION, constants.RAPI_VERSION)
131 2a7c3583 Michael Hanselmann
    self.assertEqual(client.HTTP_APP_JSON, http.HTTP_APP_JSON)
132 2a7c3583 Michael Hanselmann
    self.assertEqual(client._REQ_DATA_VERSION_FIELD, rlib2._REQ_DATA_VERSION)
133 2a7c3583 Michael Hanselmann
    self.assertEqual(client._INST_CREATE_REQV1, rlib2._INST_CREATE_REQV1)
134 c744425f Michael Hanselmann
    self.assertEqual(client._INST_REINSTALL_REQV1, rlib2._INST_REINSTALL_REQV1)
135 48436b97 Michael Hanselmann
    self.assertEqual(client._INST_NIC_PARAMS, constants.INIC_PARAMS)
136 2a7c3583 Michael Hanselmann
137 2a7c3583 Michael Hanselmann
138 95ab4de9 David Knowles
class RapiMockTest(unittest.TestCase):
139 95ab4de9 David Knowles
  def test(self):
140 95ab4de9 David Knowles
    rapi = RapiMock()
141 95ab4de9 David Knowles
    path = "/version"
142 2a7c3583 Michael Hanselmann
    self.assertEqual((404, None), rapi.FetchResponse("/foo", "GET", None))
143 09127904 Michael Hanselmann
    self.assertEqual((501, "Method not implemented"),
144 2a7c3583 Michael Hanselmann
                     rapi.FetchResponse("/version", "POST", None))
145 95ab4de9 David Knowles
    rapi.AddResponse("2")
146 2a7c3583 Michael Hanselmann
    code, response = rapi.FetchResponse("/version", "GET", None)
147 95ab4de9 David Knowles
    self.assertEqual(200, code)
148 95ab4de9 David Knowles
    self.assertEqual("2", response)
149 95ab4de9 David Knowles
    self.failUnless(isinstance(rapi.GetLastHandler(), rlib2.R_version))
150 95ab4de9 David Knowles
151 95ab4de9 David Knowles
152 2a7c3583 Michael Hanselmann
def _FakeNoSslPycurlVersion():
153 2a7c3583 Michael Hanselmann
  # Note: incomplete version tuple
154 2a7c3583 Michael Hanselmann
  return (3, "7.16.0", 462848, "mysystem", 1581, None, 0)
155 2a7c3583 Michael Hanselmann
156 2a7c3583 Michael Hanselmann
157 2a7c3583 Michael Hanselmann
def _FakeFancySslPycurlVersion():
158 2a7c3583 Michael Hanselmann
  # Note: incomplete version tuple
159 2a7c3583 Michael Hanselmann
  return (3, "7.16.0", 462848, "mysystem", 1581, "FancySSL/1.2.3", 0)
160 2a7c3583 Michael Hanselmann
161 2a7c3583 Michael Hanselmann
162 2a7c3583 Michael Hanselmann
def _FakeOpenSslPycurlVersion():
163 2a7c3583 Michael Hanselmann
  # Note: incomplete version tuple
164 2a7c3583 Michael Hanselmann
  return (2, "7.15.5", 462597, "othersystem", 668, "OpenSSL/0.9.8c", 0)
165 2a7c3583 Michael Hanselmann
166 2a7c3583 Michael Hanselmann
167 2a7c3583 Michael Hanselmann
def _FakeGnuTlsPycurlVersion():
168 2a7c3583 Michael Hanselmann
  # Note: incomplete version tuple
169 2a7c3583 Michael Hanselmann
  return (3, "7.18.0", 463360, "somesystem", 1581, "GnuTLS/2.0.4", 0)
170 2a7c3583 Michael Hanselmann
171 2a7c3583 Michael Hanselmann
172 2a7c3583 Michael Hanselmann
class TestExtendedConfig(unittest.TestCase):
173 2a7c3583 Michael Hanselmann
  def testAuth(self):
174 2a7c3583 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com",
175 2a7c3583 Michael Hanselmann
                                 username="user", password="pw",
176 a5eba783 Michael Hanselmann
                                 curl_factory=lambda: FakeCurl(RapiMock()))
177 2a7c3583 Michael Hanselmann
178 a5eba783 Michael Hanselmann
    curl = cl._CreateCurl()
179 2a7c3583 Michael Hanselmann
    self.assertEqual(curl.getopt(pycurl.HTTPAUTH), pycurl.HTTPAUTH_BASIC)
180 2a7c3583 Michael Hanselmann
    self.assertEqual(curl.getopt(pycurl.USERPWD), "user:pw")
181 2a7c3583 Michael Hanselmann
182 2a7c3583 Michael Hanselmann
  def testInvalidAuth(self):
183 2a7c3583 Michael Hanselmann
    # No username
184 2a7c3583 Michael Hanselmann
    self.assertRaises(client.Error, client.GanetiRapiClient,
185 2a7c3583 Michael Hanselmann
                      "master-a.example.com", password="pw")
186 2a7c3583 Michael Hanselmann
    # No password
187 2a7c3583 Michael Hanselmann
    self.assertRaises(client.Error, client.GanetiRapiClient,
188 2a7c3583 Michael Hanselmann
                      "master-b.example.com", username="user")
189 2a7c3583 Michael Hanselmann
190 2a7c3583 Michael Hanselmann
  def testCertVerifyInvalidCombinations(self):
191 2a7c3583 Michael Hanselmann
    self.assertRaises(client.Error, client.GenericCurlConfig,
192 2a7c3583 Michael Hanselmann
                      use_curl_cabundle=True, cafile="cert1.pem")
193 2a7c3583 Michael Hanselmann
    self.assertRaises(client.Error, client.GenericCurlConfig,
194 2a7c3583 Michael Hanselmann
                      use_curl_cabundle=True, capath="certs/")
195 2a7c3583 Michael Hanselmann
    self.assertRaises(client.Error, client.GenericCurlConfig,
196 2a7c3583 Michael Hanselmann
                      use_curl_cabundle=True,
197 2a7c3583 Michael Hanselmann
                      cafile="cert1.pem", capath="certs/")
198 2a7c3583 Michael Hanselmann
199 2a7c3583 Michael Hanselmann
  def testProxySignalVerifyHostname(self):
200 2a7c3583 Michael Hanselmann
    for use_gnutls in [False, True]:
201 2a7c3583 Michael Hanselmann
      if use_gnutls:
202 2a7c3583 Michael Hanselmann
        pcverfn = _FakeGnuTlsPycurlVersion
203 2a7c3583 Michael Hanselmann
      else:
204 2a7c3583 Michael Hanselmann
        pcverfn = _FakeOpenSslPycurlVersion
205 2a7c3583 Michael Hanselmann
206 2a7c3583 Michael Hanselmann
      for proxy in ["", "http://127.0.0.1:1234"]:
207 2a7c3583 Michael Hanselmann
        for use_signal in [False, True]:
208 2a7c3583 Michael Hanselmann
          for verify_hostname in [False, True]:
209 2a7c3583 Michael Hanselmann
            cfgfn = client.GenericCurlConfig(proxy=proxy, use_signal=use_signal,
210 2a7c3583 Michael Hanselmann
                                             verify_hostname=verify_hostname,
211 2a7c3583 Michael Hanselmann
                                             _pycurl_version_fn=pcverfn)
212 2a7c3583 Michael Hanselmann
213 a5eba783 Michael Hanselmann
            curl_factory = lambda: FakeCurl(RapiMock())
214 2a7c3583 Michael Hanselmann
            cl = client.GanetiRapiClient("master.example.com",
215 a5eba783 Michael Hanselmann
                                         curl_config_fn=cfgfn,
216 a5eba783 Michael Hanselmann
                                         curl_factory=curl_factory)
217 2a7c3583 Michael Hanselmann
218 a5eba783 Michael Hanselmann
            curl = cl._CreateCurl()
219 2a7c3583 Michael Hanselmann
            self.assertEqual(curl.getopt(pycurl.PROXY), proxy)
220 2a7c3583 Michael Hanselmann
            self.assertEqual(curl.getopt(pycurl.NOSIGNAL), not use_signal)
221 2a7c3583 Michael Hanselmann
222 2a7c3583 Michael Hanselmann
            if verify_hostname:
223 2a7c3583 Michael Hanselmann
              self.assertEqual(curl.getopt(pycurl.SSL_VERIFYHOST), 2)
224 2a7c3583 Michael Hanselmann
            else:
225 2a7c3583 Michael Hanselmann
              self.assertEqual(curl.getopt(pycurl.SSL_VERIFYHOST), 0)
226 2a7c3583 Michael Hanselmann
227 2a7c3583 Michael Hanselmann
  def testNoCertVerify(self):
228 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig()
229 2a7c3583 Michael Hanselmann
230 a5eba783 Michael Hanselmann
    curl_factory = lambda: FakeCurl(RapiMock())
231 2a7c3583 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
232 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
233 2a7c3583 Michael Hanselmann
234 a5eba783 Michael Hanselmann
    curl = cl._CreateCurl()
235 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.SSL_VERIFYPEER))
236 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAINFO))
237 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAPATH))
238 2a7c3583 Michael Hanselmann
239 2a7c3583 Michael Hanselmann
  def testCertVerifyCurlBundle(self):
240 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(use_curl_cabundle=True)
241 2a7c3583 Michael Hanselmann
242 a5eba783 Michael Hanselmann
    curl_factory = lambda: FakeCurl(RapiMock())
243 2a7c3583 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
244 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
245 2a7c3583 Michael Hanselmann
246 a5eba783 Michael Hanselmann
    curl = cl._CreateCurl()
247 2a7c3583 Michael Hanselmann
    self.assert_(curl.getopt(pycurl.SSL_VERIFYPEER))
248 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAINFO))
249 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAPATH))
250 2a7c3583 Michael Hanselmann
251 2a7c3583 Michael Hanselmann
  def testCertVerifyCafile(self):
252 2a7c3583 Michael Hanselmann
    mycert = "/tmp/some/UNUSED/cert/file.pem"
253 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(cafile=mycert)
254 2a7c3583 Michael Hanselmann
255 a5eba783 Michael Hanselmann
    curl_factory = lambda: FakeCurl(RapiMock())
256 2a7c3583 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
257 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
258 2a7c3583 Michael Hanselmann
259 a5eba783 Michael Hanselmann
    curl = cl._CreateCurl()
260 2a7c3583 Michael Hanselmann
    self.assert_(curl.getopt(pycurl.SSL_VERIFYPEER))
261 2a7c3583 Michael Hanselmann
    self.assertEqual(curl.getopt(pycurl.CAINFO), mycert)
262 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAPATH))
263 2a7c3583 Michael Hanselmann
264 2a7c3583 Michael Hanselmann
  def testCertVerifyCapath(self):
265 2a7c3583 Michael Hanselmann
    certdir = "/tmp/some/UNUSED/cert/directory"
266 2a7c3583 Michael Hanselmann
    pcverfn = _FakeOpenSslPycurlVersion
267 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(capath=certdir,
268 2a7c3583 Michael Hanselmann
                                     _pycurl_version_fn=pcverfn)
269 2a7c3583 Michael Hanselmann
270 a5eba783 Michael Hanselmann
    curl_factory = lambda: FakeCurl(RapiMock())
271 2a7c3583 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
272 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
273 2a7c3583 Michael Hanselmann
274 a5eba783 Michael Hanselmann
    curl = cl._CreateCurl()
275 2a7c3583 Michael Hanselmann
    self.assert_(curl.getopt(pycurl.SSL_VERIFYPEER))
276 2a7c3583 Michael Hanselmann
    self.assertEqual(curl.getopt(pycurl.CAPATH), certdir)
277 2a7c3583 Michael Hanselmann
    self.assertFalse(curl.getopt(pycurl.CAINFO))
278 2a7c3583 Michael Hanselmann
279 2a7c3583 Michael Hanselmann
  def testCertVerifyCapathGnuTls(self):
280 2a7c3583 Michael Hanselmann
    certdir = "/tmp/some/UNUSED/cert/directory"
281 2a7c3583 Michael Hanselmann
    pcverfn = _FakeGnuTlsPycurlVersion
282 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(capath=certdir,
283 2a7c3583 Michael Hanselmann
                                     _pycurl_version_fn=pcverfn)
284 2a7c3583 Michael Hanselmann
285 a5eba783 Michael Hanselmann
    curl_factory = lambda: FakeCurl(RapiMock())
286 a5eba783 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
287 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
288 a5eba783 Michael Hanselmann
289 a5eba783 Michael Hanselmann
    self.assertRaises(client.Error, cl._CreateCurl)
290 2a7c3583 Michael Hanselmann
291 2a7c3583 Michael Hanselmann
  def testCertVerifyNoSsl(self):
292 2a7c3583 Michael Hanselmann
    certdir = "/tmp/some/UNUSED/cert/directory"
293 2a7c3583 Michael Hanselmann
    pcverfn = _FakeNoSslPycurlVersion
294 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(capath=certdir,
295 2a7c3583 Michael Hanselmann
                                     _pycurl_version_fn=pcverfn)
296 2a7c3583 Michael Hanselmann
297 a5eba783 Michael Hanselmann
    curl_factory = lambda: FakeCurl(RapiMock())
298 a5eba783 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
299 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
300 a5eba783 Michael Hanselmann
301 a5eba783 Michael Hanselmann
    self.assertRaises(client.Error, cl._CreateCurl)
302 2a7c3583 Michael Hanselmann
303 2a7c3583 Michael Hanselmann
  def testCertVerifyFancySsl(self):
304 2a7c3583 Michael Hanselmann
    certdir = "/tmp/some/UNUSED/cert/directory"
305 2a7c3583 Michael Hanselmann
    pcverfn = _FakeFancySslPycurlVersion
306 2a7c3583 Michael Hanselmann
    cfgfn = client.GenericCurlConfig(capath=certdir,
307 2a7c3583 Michael Hanselmann
                                     _pycurl_version_fn=pcverfn)
308 2a7c3583 Michael Hanselmann
309 a5eba783 Michael Hanselmann
    curl_factory = lambda: FakeCurl(RapiMock())
310 a5eba783 Michael Hanselmann
    cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
311 a5eba783 Michael Hanselmann
                                 curl_factory=curl_factory)
312 a5eba783 Michael Hanselmann
313 a5eba783 Michael Hanselmann
    self.assertRaises(NotImplementedError, cl._CreateCurl)
314 2a7c3583 Michael Hanselmann
315 2a7c3583 Michael Hanselmann
  def testCertVerifyCapath(self):
316 2a7c3583 Michael Hanselmann
    for connect_timeout in [None, 1, 5, 10, 30, 60, 300]:
317 2a7c3583 Michael Hanselmann
      for timeout in [None, 1, 30, 60, 3600, 24 * 3600]:
318 2a7c3583 Michael Hanselmann
        cfgfn = client.GenericCurlConfig(connect_timeout=connect_timeout,
319 2a7c3583 Michael Hanselmann
                                         timeout=timeout)
320 2a7c3583 Michael Hanselmann
321 a5eba783 Michael Hanselmann
        curl_factory = lambda: FakeCurl(RapiMock())
322 2a7c3583 Michael Hanselmann
        cl = client.GanetiRapiClient("master.example.com", curl_config_fn=cfgfn,
323 a5eba783 Michael Hanselmann
                                     curl_factory=curl_factory)
324 2a7c3583 Michael Hanselmann
325 a5eba783 Michael Hanselmann
        curl = cl._CreateCurl()
326 2a7c3583 Michael Hanselmann
        self.assertEqual(curl.getopt(pycurl.CONNECTTIMEOUT), connect_timeout)
327 2a7c3583 Michael Hanselmann
        self.assertEqual(curl.getopt(pycurl.TIMEOUT), timeout)
328 2a7c3583 Michael Hanselmann
329 2a7c3583 Michael Hanselmann
330 d9b67f70 Michael Hanselmann
class GanetiRapiClientTests(testutils.GanetiTestCase):
331 95ab4de9 David Knowles
  def setUp(self):
332 d9b67f70 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
333 d9b67f70 Michael Hanselmann
334 95ab4de9 David Knowles
    self.rapi = RapiMock()
335 2a7c3583 Michael Hanselmann
    self.curl = FakeCurl(self.rapi)
336 2a7c3583 Michael Hanselmann
    self.client = client.GanetiRapiClient("master.example.com",
337 a5eba783 Michael Hanselmann
                                          curl_factory=lambda: self.curl)
338 95ab4de9 David Knowles
339 95ab4de9 David Knowles
  def assertHandler(self, handler_cls):
340 95ab4de9 David Knowles
    self.failUnless(isinstance(self.rapi.GetLastHandler(), handler_cls))
341 95ab4de9 David Knowles
342 95ab4de9 David Knowles
  def assertQuery(self, key, value):
343 95ab4de9 David Knowles
    self.assertEqual(value, self.rapi.GetLastHandler().queryargs.get(key, None))
344 95ab4de9 David Knowles
345 95ab4de9 David Knowles
  def assertItems(self, items):
346 95ab4de9 David Knowles
    self.assertEqual(items, self.rapi.GetLastHandler().items)
347 95ab4de9 David Knowles
348 95ab4de9 David Knowles
  def assertBulk(self):
349 95ab4de9 David Knowles
    self.assertTrue(self.rapi.GetLastHandler().useBulk())
350 95ab4de9 David Knowles
351 95ab4de9 David Knowles
  def assertDryRun(self):
352 95ab4de9 David Knowles
    self.assertTrue(self.rapi.GetLastHandler().dryRun())
353 95ab4de9 David Knowles
354 4245446f Adeodato Simo
  def assertUseForce(self):
355 4245446f Adeodato Simo
    self.assertTrue(self.rapi.GetLastHandler().useForce())
356 4245446f Adeodato Simo
357 10f5ab6c Michael Hanselmann
  def testEncodeQuery(self):
358 10f5ab6c Michael Hanselmann
    query = [
359 10f5ab6c Michael Hanselmann
      ("a", None),
360 10f5ab6c Michael Hanselmann
      ("b", 1),
361 10f5ab6c Michael Hanselmann
      ("c", 2),
362 10f5ab6c Michael Hanselmann
      ("d", "Foo"),
363 10f5ab6c Michael Hanselmann
      ("e", True),
364 10f5ab6c Michael Hanselmann
      ]
365 10f5ab6c Michael Hanselmann
366 10f5ab6c Michael Hanselmann
    expected = [
367 10f5ab6c Michael Hanselmann
      ("a", ""),
368 10f5ab6c Michael Hanselmann
      ("b", 1),
369 10f5ab6c Michael Hanselmann
      ("c", 2),
370 10f5ab6c Michael Hanselmann
      ("d", "Foo"),
371 10f5ab6c Michael Hanselmann
      ("e", 1),
372 10f5ab6c Michael Hanselmann
      ]
373 10f5ab6c Michael Hanselmann
374 10f5ab6c Michael Hanselmann
    self.assertEqualValues(self.client._EncodeQuery(query),
375 10f5ab6c Michael Hanselmann
                           expected)
376 10f5ab6c Michael Hanselmann
377 10f5ab6c Michael Hanselmann
    # invalid types
378 10f5ab6c Michael Hanselmann
    for i in [[1, 2, 3], {"moo": "boo"}, (1, 2, 3)]:
379 10f5ab6c Michael Hanselmann
      self.assertRaises(ValueError, self.client._EncodeQuery, [("x", i)])
380 10f5ab6c Michael Hanselmann
381 a5eba783 Michael Hanselmann
  def testCurlSettings(self):
382 a5eba783 Michael Hanselmann
    self.rapi.AddResponse("2")
383 a5eba783 Michael Hanselmann
    self.assertEqual(2, self.client.GetVersion())
384 a5eba783 Michael Hanselmann
    self.assertHandler(rlib2.R_version)
385 a5eba783 Michael Hanselmann
386 a5eba783 Michael Hanselmann
    # Signals should be disabled by default
387 a5eba783 Michael Hanselmann
    self.assert_(self.curl.getopt(pycurl.NOSIGNAL))
388 a5eba783 Michael Hanselmann
389 a5eba783 Michael Hanselmann
    # No auth and no proxy
390 a5eba783 Michael Hanselmann
    self.assertFalse(self.curl.getopt(pycurl.USERPWD))
391 a5eba783 Michael Hanselmann
    self.assert_(self.curl.getopt(pycurl.PROXY) is None)
392 a5eba783 Michael Hanselmann
393 a5eba783 Michael Hanselmann
    # Content-type is required for requests
394 a5eba783 Michael Hanselmann
    headers = self.curl.getopt(pycurl.HTTPHEADER)
395 a5eba783 Michael Hanselmann
    self.assert_("Content-type: application/json" in headers)
396 a5eba783 Michael Hanselmann
397 8a019a03 Michael Hanselmann
  def testHttpError(self):
398 8a019a03 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
399 8a019a03 Michael Hanselmann
    try:
400 8a019a03 Michael Hanselmann
      self.client.GetJobStatus(15140)
401 8a019a03 Michael Hanselmann
    except client.GanetiApiError, err:
402 8a019a03 Michael Hanselmann
      self.assertEqual(err.code, 404)
403 8a019a03 Michael Hanselmann
    else:
404 8a019a03 Michael Hanselmann
      self.fail("Didn't raise exception")
405 8a019a03 Michael Hanselmann
406 95ab4de9 David Knowles
  def testGetVersion(self):
407 95ab4de9 David Knowles
    self.rapi.AddResponse("2")
408 95ab4de9 David Knowles
    self.assertEqual(2, self.client.GetVersion())
409 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_version)
410 95ab4de9 David Knowles
411 7eac4a4d Michael Hanselmann
  def testGetFeatures(self):
412 7eac4a4d Michael Hanselmann
    for features in [[], ["foo", "bar", "baz"]]:
413 7eac4a4d Michael Hanselmann
      self.rapi.AddResponse(serializer.DumpJson(features))
414 7eac4a4d Michael Hanselmann
      self.assertEqual(features, self.client.GetFeatures())
415 7eac4a4d Michael Hanselmann
      self.assertHandler(rlib2.R_2_features)
416 7eac4a4d Michael Hanselmann
417 48436b97 Michael Hanselmann
  def testGetFeaturesNotFound(self):
418 48436b97 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
419 48436b97 Michael Hanselmann
    self.assertEqual([], self.client.GetFeatures())
420 48436b97 Michael Hanselmann
421 95ab4de9 David Knowles
  def testGetOperatingSystems(self):
422 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"beos\"]")
423 95ab4de9 David Knowles
    self.assertEqual(["beos"], self.client.GetOperatingSystems())
424 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_os)
425 95ab4de9 David Knowles
426 95ab4de9 David Knowles
  def testGetClusterTags(self):
427 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"tag\"]")
428 95ab4de9 David Knowles
    self.assertEqual(["tag"], self.client.GetClusterTags())
429 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
430 95ab4de9 David Knowles
431 95ab4de9 David Knowles
  def testAddClusterTags(self):
432 cab667cc David Knowles
    self.rapi.AddResponse("1234")
433 cab667cc David Knowles
    self.assertEqual(1234,
434 cab667cc David Knowles
        self.client.AddClusterTags(["awesome"], dry_run=True))
435 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
436 95ab4de9 David Knowles
    self.assertDryRun()
437 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
438 95ab4de9 David Knowles
439 95ab4de9 David Knowles
  def testDeleteClusterTags(self):
440 cd577680 Michael Hanselmann
    self.rapi.AddResponse("5107")
441 cd577680 Michael Hanselmann
    self.assertEqual(5107, self.client.DeleteClusterTags(["awesome"],
442 cd577680 Michael Hanselmann
                                                         dry_run=True))
443 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_tags)
444 95ab4de9 David Knowles
    self.assertDryRun()
445 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
446 95ab4de9 David Knowles
447 95ab4de9 David Knowles
  def testGetInfo(self):
448 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
449 95ab4de9 David Knowles
    self.assertEqual({}, self.client.GetInfo())
450 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_info)
451 95ab4de9 David Knowles
452 95ab4de9 David Knowles
  def testGetInstances(self):
453 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
454 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstances(bulk=True))
455 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
456 95ab4de9 David Knowles
    self.assertBulk()
457 95ab4de9 David Knowles
458 591e5103 Michael Hanselmann
  def testGetInstance(self):
459 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
460 591e5103 Michael Hanselmann
    self.assertEqual([], self.client.GetInstance("instance"))
461 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
462 95ab4de9 David Knowles
    self.assertItems(["instance"])
463 95ab4de9 David Knowles
464 591e5103 Michael Hanselmann
  def testGetInstanceInfo(self):
465 591e5103 Michael Hanselmann
    self.rapi.AddResponse("21291")
466 591e5103 Michael Hanselmann
    self.assertEqual(21291, self.client.GetInstanceInfo("inst3"))
467 591e5103 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_info)
468 591e5103 Michael Hanselmann
    self.assertItems(["inst3"])
469 591e5103 Michael Hanselmann
    self.assertQuery("static", None)
470 591e5103 Michael Hanselmann
471 591e5103 Michael Hanselmann
    self.rapi.AddResponse("3428")
472 591e5103 Michael Hanselmann
    self.assertEqual(3428, self.client.GetInstanceInfo("inst31", static=False))
473 591e5103 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_info)
474 591e5103 Michael Hanselmann
    self.assertItems(["inst31"])
475 591e5103 Michael Hanselmann
    self.assertQuery("static", ["0"])
476 591e5103 Michael Hanselmann
477 591e5103 Michael Hanselmann
    self.rapi.AddResponse("15665")
478 591e5103 Michael Hanselmann
    self.assertEqual(15665, self.client.GetInstanceInfo("inst32", static=True))
479 591e5103 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_info)
480 591e5103 Michael Hanselmann
    self.assertItems(["inst32"])
481 591e5103 Michael Hanselmann
    self.assertQuery("static", ["1"])
482 591e5103 Michael Hanselmann
483 8a47b447 Michael Hanselmann
  def testCreateInstanceOldVersion(self):
484 48436b97 Michael Hanselmann
    # No NICs
485 48436b97 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
486 48436b97 Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.CreateInstance,
487 48436b97 Michael Hanselmann
                      "create", "inst1.example.com", "plain", [], [])
488 48436b97 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
489 48436b97 Michael Hanselmann
490 48436b97 Michael Hanselmann
    # More than one NIC
491 48436b97 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
492 48436b97 Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.CreateInstance,
493 48436b97 Michael Hanselmann
                      "create", "inst1.example.com", "plain", [],
494 48436b97 Michael Hanselmann
                      [{}, {}, {}])
495 48436b97 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
496 48436b97 Michael Hanselmann
497 48436b97 Michael Hanselmann
    # Unsupported NIC fields
498 48436b97 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
499 48436b97 Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.CreateInstance,
500 48436b97 Michael Hanselmann
                      "create", "inst1.example.com", "plain", [],
501 48436b97 Michael Hanselmann
                      [{"x": True, "y": False}])
502 48436b97 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
503 48436b97 Michael Hanselmann
504 48436b97 Michael Hanselmann
    # Unsupported disk fields
505 48436b97 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
506 48436b97 Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.CreateInstance,
507 48436b97 Michael Hanselmann
                      "create", "inst1.example.com", "plain",
508 48436b97 Michael Hanselmann
                      [{}, {"moo": "foo",}], [{}])
509 48436b97 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
510 48436b97 Michael Hanselmann
511 48436b97 Michael Hanselmann
    # Unsupported fields
512 48436b97 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
513 48436b97 Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.CreateInstance,
514 48436b97 Michael Hanselmann
                      "create", "inst1.example.com", "plain", [], [{}],
515 48436b97 Michael Hanselmann
                      hello_world=123)
516 48436b97 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
517 48436b97 Michael Hanselmann
518 48436b97 Michael Hanselmann
    self.rapi.AddResponse(None, code=404)
519 48436b97 Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.CreateInstance,
520 48436b97 Michael Hanselmann
                      "create", "inst1.example.com", "plain", [], [{}],
521 48436b97 Michael Hanselmann
                      memory=128)
522 48436b97 Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
523 48436b97 Michael Hanselmann
524 48436b97 Michael Hanselmann
    # Normal creation
525 48436b97 Michael Hanselmann
    testnics = [
526 48436b97 Michael Hanselmann
      [{}],
527 48436b97 Michael Hanselmann
      [{ "mac": constants.VALUE_AUTO, }],
528 48436b97 Michael Hanselmann
      [{ "ip": "192.0.2.99", "mode": constants.NIC_MODE_ROUTED, }],
529 48436b97 Michael Hanselmann
      ]
530 48436b97 Michael Hanselmann
531 48436b97 Michael Hanselmann
    testdisks = [
532 48436b97 Michael Hanselmann
      [],
533 48436b97 Michael Hanselmann
      [{ "size": 128, }],
534 48436b97 Michael Hanselmann
      [{ "size": 321, }, { "size": 4096, }],
535 48436b97 Michael Hanselmann
      ]
536 48436b97 Michael Hanselmann
537 48436b97 Michael Hanselmann
    for idx, nics in enumerate(testnics):
538 48436b97 Michael Hanselmann
      for disks in testdisks:
539 48436b97 Michael Hanselmann
        beparams = {
540 48436b97 Michael Hanselmann
          constants.BE_MEMORY: 512,
541 48436b97 Michael Hanselmann
          constants.BE_AUTO_BALANCE: False,
542 48436b97 Michael Hanselmann
          }
543 48436b97 Michael Hanselmann
        hvparams = {
544 48436b97 Michael Hanselmann
          constants.HV_MIGRATION_PORT: 9876,
545 48436b97 Michael Hanselmann
          constants.HV_VNC_TLS: True,
546 48436b97 Michael Hanselmann
          }
547 48436b97 Michael Hanselmann
548 48436b97 Michael Hanselmann
        self.rapi.AddResponse(None, code=404)
549 48436b97 Michael Hanselmann
        self.rapi.AddResponse(serializer.DumpJson(3122617 + idx))
550 48436b97 Michael Hanselmann
        job_id = self.client.CreateInstance("create", "inst1.example.com",
551 48436b97 Michael Hanselmann
                                            "plain", disks, nics,
552 48436b97 Michael Hanselmann
                                            pnode="node99", dry_run=True,
553 48436b97 Michael Hanselmann
                                            hvparams=hvparams,
554 48436b97 Michael Hanselmann
                                            beparams=beparams)
555 48436b97 Michael Hanselmann
        self.assertEqual(job_id, 3122617 + idx)
556 48436b97 Michael Hanselmann
        self.assertHandler(rlib2.R_2_instances)
557 48436b97 Michael Hanselmann
        self.assertDryRun()
558 48436b97 Michael Hanselmann
        self.assertEqual(self.rapi.CountPending(), 0)
559 48436b97 Michael Hanselmann
560 54dc4fdb Michael Hanselmann
        data = serializer.LoadJson(self.rapi.GetLastRequestData())
561 48436b97 Michael Hanselmann
        self.assertEqual(data["name"], "inst1.example.com")
562 48436b97 Michael Hanselmann
        self.assertEqual(data["disk_template"], "plain")
563 48436b97 Michael Hanselmann
        self.assertEqual(data["pnode"], "node99")
564 48436b97 Michael Hanselmann
        self.assertEqual(data[constants.BE_MEMORY], 512)
565 48436b97 Michael Hanselmann
        self.assertEqual(data[constants.BE_AUTO_BALANCE], False)
566 48436b97 Michael Hanselmann
        self.assertEqual(data[constants.HV_MIGRATION_PORT], 9876)
567 48436b97 Michael Hanselmann
        self.assertEqual(data[constants.HV_VNC_TLS], True)
568 48436b97 Michael Hanselmann
        self.assertEqual(data["disks"], [disk["size"] for disk in disks])
569 8a47b447 Michael Hanselmann
570 95ab4de9 David Knowles
  def testCreateInstance(self):
571 8a47b447 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_CREATE_REQV1]))
572 8a47b447 Michael Hanselmann
    self.rapi.AddResponse("23030")
573 8a47b447 Michael Hanselmann
    job_id = self.client.CreateInstance("create", "inst1.example.com",
574 8a47b447 Michael Hanselmann
                                        "plain", [], [], dry_run=True)
575 8a47b447 Michael Hanselmann
    self.assertEqual(job_id, 23030)
576 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances)
577 95ab4de9 David Knowles
    self.assertDryRun()
578 95ab4de9 David Knowles
579 2a7c3583 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
580 8a47b447 Michael Hanselmann
581 8a47b447 Michael Hanselmann
    for field in ["dry_run", "beparams", "hvparams", "start"]:
582 8a47b447 Michael Hanselmann
      self.assertFalse(field in data)
583 8a47b447 Michael Hanselmann
584 8a47b447 Michael Hanselmann
    self.assertEqual(data["name"], "inst1.example.com")
585 8a47b447 Michael Hanselmann
    self.assertEqual(data["disk_template"], "plain")
586 8a47b447 Michael Hanselmann
587 8a47b447 Michael Hanselmann
  def testCreateInstance2(self):
588 8a47b447 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_CREATE_REQV1]))
589 8a47b447 Michael Hanselmann
    self.rapi.AddResponse("24740")
590 8a47b447 Michael Hanselmann
    job_id = self.client.CreateInstance("import", "inst2.example.com",
591 8a47b447 Michael Hanselmann
                                        "drbd8", [{"size": 100,}],
592 8a47b447 Michael Hanselmann
                                        [{}, {"bridge": "br1", }],
593 8a47b447 Michael Hanselmann
                                        dry_run=False, start=True,
594 8a47b447 Michael Hanselmann
                                        pnode="node1", snode="node9",
595 8a47b447 Michael Hanselmann
                                        ip_check=False)
596 8a47b447 Michael Hanselmann
    self.assertEqual(job_id, 24740)
597 8a47b447 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances)
598 8a47b447 Michael Hanselmann
599 2a7c3583 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
600 8a47b447 Michael Hanselmann
    self.assertEqual(data[rlib2._REQ_DATA_VERSION], 1)
601 8a47b447 Michael Hanselmann
    self.assertEqual(data["name"], "inst2.example.com")
602 8a47b447 Michael Hanselmann
    self.assertEqual(data["disk_template"], "drbd8")
603 8a47b447 Michael Hanselmann
    self.assertEqual(data["start"], True)
604 8a47b447 Michael Hanselmann
    self.assertEqual(data["ip_check"], False)
605 8a47b447 Michael Hanselmann
    self.assertEqualValues(data["disks"], [{"size": 100,}])
606 8a47b447 Michael Hanselmann
    self.assertEqualValues(data["nics"], [{}, {"bridge": "br1", }])
607 8a47b447 Michael Hanselmann
608 95ab4de9 David Knowles
  def testDeleteInstance(self):
609 cab667cc David Knowles
    self.rapi.AddResponse("1234")
610 cab667cc David Knowles
    self.assertEqual(1234, self.client.DeleteInstance("instance", dry_run=True))
611 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name)
612 95ab4de9 David Knowles
    self.assertItems(["instance"])
613 95ab4de9 David Knowles
    self.assertDryRun()
614 95ab4de9 David Knowles
615 95ab4de9 David Knowles
  def testGetInstanceTags(self):
616 95ab4de9 David Knowles
    self.rapi.AddResponse("[]")
617 95ab4de9 David Knowles
    self.assertEqual([], self.client.GetInstanceTags("fooinstance"))
618 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
619 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
620 95ab4de9 David Knowles
621 95ab4de9 David Knowles
  def testAddInstanceTags(self):
622 cab667cc David Knowles
    self.rapi.AddResponse("1234")
623 cab667cc David Knowles
    self.assertEqual(1234,
624 cab667cc David Knowles
        self.client.AddInstanceTags("fooinstance", ["awesome"], dry_run=True))
625 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
626 95ab4de9 David Knowles
    self.assertItems(["fooinstance"])
627 95ab4de9 David Knowles
    self.assertDryRun()
628 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
629 95ab4de9 David Knowles
630 95ab4de9 David Knowles
  def testDeleteInstanceTags(self):
631 cd577680 Michael Hanselmann
    self.rapi.AddResponse("25826")
632 cd577680 Michael Hanselmann
    self.assertEqual(25826, self.client.DeleteInstanceTags("foo", ["awesome"],
633 cd577680 Michael Hanselmann
                                                           dry_run=True))
634 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_tags)
635 95ab4de9 David Knowles
    self.assertItems(["foo"])
636 95ab4de9 David Knowles
    self.assertDryRun()
637 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
638 95ab4de9 David Knowles
639 95ab4de9 David Knowles
  def testRebootInstance(self):
640 cd577680 Michael Hanselmann
    self.rapi.AddResponse("6146")
641 cd577680 Michael Hanselmann
    job_id = self.client.RebootInstance("i-bar", reboot_type="hard",
642 cd577680 Michael Hanselmann
                                        ignore_secondaries=True, dry_run=True)
643 cd577680 Michael Hanselmann
    self.assertEqual(6146, job_id)
644 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reboot)
645 95ab4de9 David Knowles
    self.assertItems(["i-bar"])
646 95ab4de9 David Knowles
    self.assertDryRun()
647 95ab4de9 David Knowles
    self.assertQuery("type", ["hard"])
648 10f5ab6c Michael Hanselmann
    self.assertQuery("ignore_secondaries", ["1"])
649 95ab4de9 David Knowles
650 95ab4de9 David Knowles
  def testShutdownInstance(self):
651 cd577680 Michael Hanselmann
    self.rapi.AddResponse("1487")
652 cd577680 Michael Hanselmann
    self.assertEqual(1487, self.client.ShutdownInstance("foo-instance",
653 cd577680 Michael Hanselmann
                                                        dry_run=True))
654 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_shutdown)
655 95ab4de9 David Knowles
    self.assertItems(["foo-instance"])
656 95ab4de9 David Knowles
    self.assertDryRun()
657 95ab4de9 David Knowles
658 95ab4de9 David Knowles
  def testStartupInstance(self):
659 cd577680 Michael Hanselmann
    self.rapi.AddResponse("27149")
660 cd577680 Michael Hanselmann
    self.assertEqual(27149, self.client.StartupInstance("bar-instance",
661 cd577680 Michael Hanselmann
                                                        dry_run=True))
662 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_startup)
663 95ab4de9 David Knowles
    self.assertItems(["bar-instance"])
664 95ab4de9 David Knowles
    self.assertDryRun()
665 95ab4de9 David Knowles
666 95ab4de9 David Knowles
  def testReinstallInstance(self):
667 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
668 cd577680 Michael Hanselmann
    self.rapi.AddResponse("19119")
669 fcee9675 David Knowles
    self.assertEqual(19119, self.client.ReinstallInstance("baz-instance",
670 fcee9675 David Knowles
                                                          os="DOS",
671 cd577680 Michael Hanselmann
                                                          no_startup=True))
672 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
673 95ab4de9 David Knowles
    self.assertItems(["baz-instance"])
674 95ab4de9 David Knowles
    self.assertQuery("os", ["DOS"])
675 95ab4de9 David Knowles
    self.assertQuery("nostartup", ["1"])
676 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
677 c744425f Michael Hanselmann
678 c744425f Michael Hanselmann
  def testReinstallInstanceNew(self):
679 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_REINSTALL_REQV1]))
680 c744425f Michael Hanselmann
    self.rapi.AddResponse("25689")
681 c744425f Michael Hanselmann
    self.assertEqual(25689, self.client.ReinstallInstance("moo-instance",
682 c744425f Michael Hanselmann
                                                          os="Debian",
683 c744425f Michael Hanselmann
                                                          no_startup=True))
684 c744425f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
685 c744425f Michael Hanselmann
    self.assertItems(["moo-instance"])
686 c744425f Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
687 c744425f Michael Hanselmann
    self.assertEqual(len(data), 2)
688 c744425f Michael Hanselmann
    self.assertEqual(data["os"], "Debian")
689 c744425f Michael Hanselmann
    self.assertEqual(data["start"], False)
690 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
691 c744425f Michael Hanselmann
692 c744425f Michael Hanselmann
  def testReinstallInstanceWithOsparams1(self):
693 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([]))
694 c744425f Michael Hanselmann
    self.assertRaises(client.GanetiApiError, self.client.ReinstallInstance,
695 c744425f Michael Hanselmann
                      "doo-instance", osparams={"x": "y"})
696 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
697 c744425f Michael Hanselmann
698 c744425f Michael Hanselmann
  def testReinstallInstanceWithOsparams2(self):
699 c744425f Michael Hanselmann
    osparams = {
700 c744425f Michael Hanselmann
      "Hello": "World",
701 c744425f Michael Hanselmann
      "foo": "bar",
702 c744425f Michael Hanselmann
      }
703 c744425f Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_REINSTALL_REQV1]))
704 c744425f Michael Hanselmann
    self.rapi.AddResponse("1717")
705 c744425f Michael Hanselmann
    self.assertEqual(1717, self.client.ReinstallInstance("zoo-instance",
706 c744425f Michael Hanselmann
                                                         osparams=osparams))
707 c744425f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_reinstall)
708 c744425f Michael Hanselmann
    self.assertItems(["zoo-instance"])
709 c744425f Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
710 c744425f Michael Hanselmann
    self.assertEqual(len(data), 2)
711 c744425f Michael Hanselmann
    self.assertEqual(data["osparams"], osparams)
712 c744425f Michael Hanselmann
    self.assertEqual(data["start"], True)
713 c744425f Michael Hanselmann
    self.assertEqual(self.rapi.CountPending(), 0)
714 95ab4de9 David Knowles
715 95ab4de9 David Knowles
  def testReplaceInstanceDisks(self):
716 95ab4de9 David Knowles
    self.rapi.AddResponse("999")
717 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-name",
718 bfc2002f Michael Hanselmann
        disks=[0, 1], dry_run=True, iallocator="hail")
719 95ab4de9 David Knowles
    self.assertEqual(999, job_id)
720 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_instances_name_replace_disks)
721 95ab4de9 David Knowles
    self.assertItems(["instance-name"])
722 bfc2002f Michael Hanselmann
    self.assertQuery("disks", ["0,1"])
723 95ab4de9 David Knowles
    self.assertQuery("mode", ["replace_auto"])
724 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
725 95ab4de9 David Knowles
    self.assertDryRun()
726 95ab4de9 David Knowles
727 95ab4de9 David Knowles
    self.rapi.AddResponse("1000")
728 95ab4de9 David Knowles
    job_id = self.client.ReplaceInstanceDisks("instance-bar",
729 bfc2002f Michael Hanselmann
        disks=[1], mode="replace_on_secondary", remote_node="foo-node",
730 95ab4de9 David Knowles
        dry_run=True)
731 95ab4de9 David Knowles
    self.assertEqual(1000, job_id)
732 95ab4de9 David Knowles
    self.assertItems(["instance-bar"])
733 bfc2002f Michael Hanselmann
    self.assertQuery("disks", ["1"])
734 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["foo-node"])
735 95ab4de9 David Knowles
    self.assertDryRun()
736 95ab4de9 David Knowles
737 bfc2002f Michael Hanselmann
    self.rapi.AddResponse("5175")
738 bfc2002f Michael Hanselmann
    self.assertEqual(5175, self.client.ReplaceInstanceDisks("instance-moo"))
739 bfc2002f Michael Hanselmann
    self.assertItems(["instance-moo"])
740 bfc2002f Michael Hanselmann
    self.assertQuery("disks", None)
741 bfc2002f Michael Hanselmann
742 ebeb600f Michael Hanselmann
  def testPrepareExport(self):
743 ebeb600f Michael Hanselmann
    self.rapi.AddResponse("8326")
744 ebeb600f Michael Hanselmann
    self.assertEqual(8326, self.client.PrepareExport("inst1", "local"))
745 ebeb600f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_prepare_export)
746 ebeb600f Michael Hanselmann
    self.assertItems(["inst1"])
747 ebeb600f Michael Hanselmann
    self.assertQuery("mode", ["local"])
748 ebeb600f Michael Hanselmann
749 ebeb600f Michael Hanselmann
  def testExportInstance(self):
750 ebeb600f Michael Hanselmann
    self.rapi.AddResponse("19695")
751 ebeb600f Michael Hanselmann
    job_id = self.client.ExportInstance("inst2", "local", "nodeX",
752 ebeb600f Michael Hanselmann
                                        shutdown=True)
753 ebeb600f Michael Hanselmann
    self.assertEqual(job_id, 19695)
754 ebeb600f Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_export)
755 ebeb600f Michael Hanselmann
    self.assertItems(["inst2"])
756 ebeb600f Michael Hanselmann
757 2a7c3583 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
758 ebeb600f Michael Hanselmann
    self.assertEqual(data["mode"], "local")
759 ebeb600f Michael Hanselmann
    self.assertEqual(data["destination"], "nodeX")
760 ebeb600f Michael Hanselmann
    self.assertEqual(data["shutdown"], True)
761 ebeb600f Michael Hanselmann
762 e0ac6ce6 Michael Hanselmann
  def testMigrateInstanceDefaults(self):
763 e0ac6ce6 Michael Hanselmann
    self.rapi.AddResponse("24873")
764 e0ac6ce6 Michael Hanselmann
    job_id = self.client.MigrateInstance("inst91")
765 e0ac6ce6 Michael Hanselmann
    self.assertEqual(job_id, 24873)
766 e0ac6ce6 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_migrate)
767 e0ac6ce6 Michael Hanselmann
    self.assertItems(["inst91"])
768 e0ac6ce6 Michael Hanselmann
769 e0ac6ce6 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
770 e0ac6ce6 Michael Hanselmann
    self.assertFalse(data)
771 e0ac6ce6 Michael Hanselmann
772 e0ac6ce6 Michael Hanselmann
  def testMigrateInstance(self):
773 e0ac6ce6 Michael Hanselmann
    for mode in constants.HT_MIGRATION_MODES:
774 e0ac6ce6 Michael Hanselmann
      for cleanup in [False, True]:
775 e0ac6ce6 Michael Hanselmann
        self.rapi.AddResponse("31910")
776 e0ac6ce6 Michael Hanselmann
        job_id = self.client.MigrateInstance("inst289", mode=mode,
777 e0ac6ce6 Michael Hanselmann
                                             cleanup=cleanup)
778 e0ac6ce6 Michael Hanselmann
        self.assertEqual(job_id, 31910)
779 e0ac6ce6 Michael Hanselmann
        self.assertHandler(rlib2.R_2_instances_name_migrate)
780 e0ac6ce6 Michael Hanselmann
        self.assertItems(["inst289"])
781 e0ac6ce6 Michael Hanselmann
782 e0ac6ce6 Michael Hanselmann
        data = serializer.LoadJson(self.rapi.GetLastRequestData())
783 e0ac6ce6 Michael Hanselmann
        self.assertEqual(len(data), 2)
784 e0ac6ce6 Michael Hanselmann
        self.assertEqual(data["mode"], mode)
785 e0ac6ce6 Michael Hanselmann
        self.assertEqual(data["cleanup"], cleanup)
786 e0ac6ce6 Michael Hanselmann
787 d654aae1 Michael Hanselmann
  def testRenameInstanceDefaults(self):
788 d654aae1 Michael Hanselmann
    new_name = "newnametha7euqu"
789 d654aae1 Michael Hanselmann
    self.rapi.AddResponse("8791")
790 d654aae1 Michael Hanselmann
    job_id = self.client.RenameInstance("inst18821", new_name)
791 d654aae1 Michael Hanselmann
    self.assertEqual(job_id, 8791)
792 d654aae1 Michael Hanselmann
    self.assertHandler(rlib2.R_2_instances_name_rename)
793 d654aae1 Michael Hanselmann
    self.assertItems(["inst18821"])
794 d654aae1 Michael Hanselmann
795 d654aae1 Michael Hanselmann
    data = serializer.LoadJson(self.rapi.GetLastRequestData())
796 d654aae1 Michael Hanselmann
    self.assertEqualValues(data, {"new_name": new_name, })
797 d654aae1 Michael Hanselmann
798 d654aae1 Michael Hanselmann
  def testRenameInstance(self):
799 d654aae1 Michael Hanselmann
    new_name = "new-name-yiux1iin"
800 d654aae1 Michael Hanselmann
    for ip_check in [False, True]:
801 d654aae1 Michael Hanselmann
      for name_check in [False, True]:
802 d654aae1 Michael Hanselmann
        self.rapi.AddResponse("24776")
803 d654aae1 Michael Hanselmann
        job_id = self.client.RenameInstance("inst20967", new_name,
804 d654aae1 Michael Hanselmann
                                             ip_check=ip_check,
805 d654aae1 Michael Hanselmann
                                             name_check=name_check)
806 d654aae1 Michael Hanselmann
        self.assertEqual(job_id, 24776)
807 d654aae1 Michael Hanselmann
        self.assertHandler(rlib2.R_2_instances_name_rename)
808 d654aae1 Michael Hanselmann
        self.assertItems(["inst20967"])
809 d654aae1 Michael Hanselmann
810 d654aae1 Michael Hanselmann
        data = serializer.LoadJson(self.rapi.GetLastRequestData())
811 d654aae1 Michael Hanselmann
        self.assertEqual(len(data), 3)
812 d654aae1 Michael Hanselmann
        self.assertEqual(data["new_name"], new_name)
813 d654aae1 Michael Hanselmann
        self.assertEqual(data["ip_check"], ip_check)
814 d654aae1 Michael Hanselmann
        self.assertEqual(data["name_check"], name_check)
815 d654aae1 Michael Hanselmann
816 95ab4de9 David Knowles
  def testGetJobs(self):
817 2004e673 Iustin Pop
    self.rapi.AddResponse('[ { "id": "123", "uri": "\\/2\\/jobs\\/123" },'
818 2004e673 Iustin Pop
                          '  { "id": "124", "uri": "\\/2\\/jobs\\/124" } ]')
819 95ab4de9 David Knowles
    self.assertEqual([123, 124], self.client.GetJobs())
820 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs)
821 95ab4de9 David Knowles
822 95ab4de9 David Knowles
  def testGetJobStatus(self):
823 95ab4de9 David Knowles
    self.rapi.AddResponse("{\"foo\": \"bar\"}")
824 95ab4de9 David Knowles
    self.assertEqual({"foo": "bar"}, self.client.GetJobStatus(1234))
825 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
826 95ab4de9 David Knowles
    self.assertItems(["1234"])
827 95ab4de9 David Knowles
828 d9b67f70 Michael Hanselmann
  def testWaitForJobChange(self):
829 d9b67f70 Michael Hanselmann
    fields = ["id", "summary"]
830 d9b67f70 Michael Hanselmann
    expected = {
831 d9b67f70 Michael Hanselmann
      "job_info": [123, "something"],
832 d9b67f70 Michael Hanselmann
      "log_entries": [],
833 d9b67f70 Michael Hanselmann
      }
834 d9b67f70 Michael Hanselmann
835 d9b67f70 Michael Hanselmann
    self.rapi.AddResponse(serializer.DumpJson(expected))
836 d9b67f70 Michael Hanselmann
    result = self.client.WaitForJobChange(123, fields, [], -1)
837 d9b67f70 Michael Hanselmann
    self.assertEqualValues(expected, result)
838 d9b67f70 Michael Hanselmann
    self.assertHandler(rlib2.R_2_jobs_id_wait)
839 d9b67f70 Michael Hanselmann
    self.assertItems(["123"])
840 d9b67f70 Michael Hanselmann
841 cf9ada49 Michael Hanselmann
  def testCancelJob(self):
842 cd577680 Michael Hanselmann
    self.rapi.AddResponse("[true, \"Job 123 will be canceled\"]")
843 cd577680 Michael Hanselmann
    self.assertEqual([True, "Job 123 will be canceled"],
844 cf9ada49 Michael Hanselmann
                     self.client.CancelJob(999, dry_run=True))
845 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_jobs_id)
846 95ab4de9 David Knowles
    self.assertItems(["999"])
847 95ab4de9 David Knowles
    self.assertDryRun()
848 95ab4de9 David Knowles
849 95ab4de9 David Knowles
  def testGetNodes(self):
850 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
851 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
852 95ab4de9 David Knowles
    self.assertEqual(["node1", "node2"], self.client.GetNodes())
853 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
854 95ab4de9 David Knowles
855 95ab4de9 David Knowles
    self.rapi.AddResponse("[ { \"id\": \"node1\", \"uri\": \"uri1\" },"
856 95ab4de9 David Knowles
                          " { \"id\": \"node2\", \"uri\": \"uri2\" } ]")
857 95ab4de9 David Knowles
    self.assertEqual([{"id": "node1", "uri": "uri1"},
858 95ab4de9 David Knowles
                      {"id": "node2", "uri": "uri2"}],
859 95ab4de9 David Knowles
                     self.client.GetNodes(bulk=True))
860 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes)
861 95ab4de9 David Knowles
    self.assertBulk()
862 95ab4de9 David Knowles
863 591e5103 Michael Hanselmann
  def testGetNode(self):
864 95ab4de9 David Knowles
    self.rapi.AddResponse("{}")
865 591e5103 Michael Hanselmann
    self.assertEqual({}, self.client.GetNode("node-foo"))
866 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name)
867 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
868 95ab4de9 David Knowles
869 95ab4de9 David Knowles
  def testEvacuateNode(self):
870 95ab4de9 David Knowles
    self.rapi.AddResponse("9876")
871 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-1", remote_node="node-2")
872 95ab4de9 David Knowles
    self.assertEqual(9876, job_id)
873 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_evacuate)
874 95ab4de9 David Knowles
    self.assertItems(["node-1"])
875 95ab4de9 David Knowles
    self.assertQuery("remote_node", ["node-2"])
876 95ab4de9 David Knowles
877 95ab4de9 David Knowles
    self.rapi.AddResponse("8888")
878 95ab4de9 David Knowles
    job_id = self.client.EvacuateNode("node-3", iallocator="hail", dry_run=True)
879 95ab4de9 David Knowles
    self.assertEqual(8888, job_id)
880 95ab4de9 David Knowles
    self.assertItems(["node-3"])
881 95ab4de9 David Knowles
    self.assertQuery("iallocator", ["hail"])
882 95ab4de9 David Knowles
    self.assertDryRun()
883 95ab4de9 David Knowles
884 95ab4de9 David Knowles
    self.assertRaises(client.GanetiApiError,
885 95ab4de9 David Knowles
                      self.client.EvacuateNode,
886 95ab4de9 David Knowles
                      "node-4", iallocator="hail", remote_node="node-5")
887 95ab4de9 David Knowles
888 95ab4de9 David Knowles
  def testMigrateNode(self):
889 95ab4de9 David Knowles
    self.rapi.AddResponse("1111")
890 95ab4de9 David Knowles
    self.assertEqual(1111, self.client.MigrateNode("node-a", dry_run=True))
891 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
892 95ab4de9 David Knowles
    self.assertItems(["node-a"])
893 1f334d96 Iustin Pop
    self.assert_("mode" not in self.rapi.GetLastHandler().queryargs)
894 1f334d96 Iustin Pop
    self.assertDryRun()
895 1f334d96 Iustin Pop
896 1f334d96 Iustin Pop
    self.rapi.AddResponse("1112")
897 1f334d96 Iustin Pop
    self.assertEqual(1112, self.client.MigrateNode("node-a", dry_run=True,
898 1f334d96 Iustin Pop
                                                   mode="live"))
899 1f334d96 Iustin Pop
    self.assertHandler(rlib2.R_2_nodes_name_migrate)
900 1f334d96 Iustin Pop
    self.assertItems(["node-a"])
901 1f334d96 Iustin Pop
    self.assertQuery("mode", ["live"])
902 95ab4de9 David Knowles
    self.assertDryRun()
903 95ab4de9 David Knowles
904 95ab4de9 David Knowles
  def testGetNodeRole(self):
905 95ab4de9 David Knowles
    self.rapi.AddResponse("\"master\"")
906 95ab4de9 David Knowles
    self.assertEqual("master", self.client.GetNodeRole("node-a"))
907 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
908 95ab4de9 David Knowles
    self.assertItems(["node-a"])
909 95ab4de9 David Knowles
910 95ab4de9 David Knowles
  def testSetNodeRole(self):
911 95ab4de9 David Knowles
    self.rapi.AddResponse("789")
912 95ab4de9 David Knowles
    self.assertEqual(789,
913 95ab4de9 David Knowles
        self.client.SetNodeRole("node-foo", "master-candidate", force=True))
914 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_role)
915 95ab4de9 David Knowles
    self.assertItems(["node-foo"])
916 10f5ab6c Michael Hanselmann
    self.assertQuery("force", ["1"])
917 2a7c3583 Michael Hanselmann
    self.assertEqual("\"master-candidate\"", self.rapi.GetLastRequestData())
918 95ab4de9 David Knowles
919 95ab4de9 David Knowles
  def testGetNodeStorageUnits(self):
920 95ab4de9 David Knowles
    self.rapi.AddResponse("42")
921 95ab4de9 David Knowles
    self.assertEqual(42,
922 95ab4de9 David Knowles
        self.client.GetNodeStorageUnits("node-x", "lvm-pv", "fields"))
923 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage)
924 95ab4de9 David Knowles
    self.assertItems(["node-x"])
925 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
926 95ab4de9 David Knowles
    self.assertQuery("output_fields", ["fields"])
927 95ab4de9 David Knowles
928 95ab4de9 David Knowles
  def testModifyNodeStorageUnits(self):
929 95ab4de9 David Knowles
    self.rapi.AddResponse("14")
930 95ab4de9 David Knowles
    self.assertEqual(14,
931 95ab4de9 David Knowles
        self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda"))
932 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
933 95ab4de9 David Knowles
    self.assertItems(["node-z"])
934 95ab4de9 David Knowles
    self.assertQuery("storage_type", ["lvm-pv"])
935 95ab4de9 David Knowles
    self.assertQuery("name", ["hda"])
936 fde28316 Michael Hanselmann
    self.assertQuery("allocatable", None)
937 fde28316 Michael Hanselmann
938 fde28316 Michael Hanselmann
    for allocatable, query_allocatable in [(True, "1"), (False, "0")]:
939 fde28316 Michael Hanselmann
      self.rapi.AddResponse("7205")
940 fde28316 Michael Hanselmann
      job_id = self.client.ModifyNodeStorageUnits("node-z", "lvm-pv", "hda",
941 fde28316 Michael Hanselmann
                                                  allocatable=allocatable)
942 fde28316 Michael Hanselmann
      self.assertEqual(7205, job_id)
943 fde28316 Michael Hanselmann
      self.assertHandler(rlib2.R_2_nodes_name_storage_modify)
944 fde28316 Michael Hanselmann
      self.assertItems(["node-z"])
945 fde28316 Michael Hanselmann
      self.assertQuery("storage_type", ["lvm-pv"])
946 fde28316 Michael Hanselmann
      self.assertQuery("name", ["hda"])
947 fde28316 Michael Hanselmann
      self.assertQuery("allocatable", [query_allocatable])
948 95ab4de9 David Knowles
949 752df8bb Michael Hanselmann
  def testRepairNodeStorageUnits(self):
950 752df8bb Michael Hanselmann
    self.rapi.AddResponse("99")
951 752df8bb Michael Hanselmann
    self.assertEqual(99, self.client.RepairNodeStorageUnits("node-z", "lvm-pv",
952 752df8bb Michael Hanselmann
                                                            "hda"))
953 752df8bb Michael Hanselmann
    self.assertHandler(rlib2.R_2_nodes_name_storage_repair)
954 752df8bb Michael Hanselmann
    self.assertItems(["node-z"])
955 752df8bb Michael Hanselmann
    self.assertQuery("storage_type", ["lvm-pv"])
956 752df8bb Michael Hanselmann
    self.assertQuery("name", ["hda"])
957 752df8bb Michael Hanselmann
958 95ab4de9 David Knowles
  def testGetNodeTags(self):
959 95ab4de9 David Knowles
    self.rapi.AddResponse("[\"fry\", \"bender\"]")
960 95ab4de9 David Knowles
    self.assertEqual(["fry", "bender"], self.client.GetNodeTags("node-k"))
961 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
962 95ab4de9 David Knowles
    self.assertItems(["node-k"])
963 95ab4de9 David Knowles
964 95ab4de9 David Knowles
  def testAddNodeTags(self):
965 cab667cc David Knowles
    self.rapi.AddResponse("1234")
966 cab667cc David Knowles
    self.assertEqual(1234,
967 cab667cc David Knowles
        self.client.AddNodeTags("node-v", ["awesome"], dry_run=True))
968 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
969 95ab4de9 David Knowles
    self.assertItems(["node-v"])
970 95ab4de9 David Knowles
    self.assertDryRun()
971 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
972 95ab4de9 David Knowles
973 95ab4de9 David Knowles
  def testDeleteNodeTags(self):
974 cd577680 Michael Hanselmann
    self.rapi.AddResponse("16861")
975 cd577680 Michael Hanselmann
    self.assertEqual(16861, self.client.DeleteNodeTags("node-w", ["awesome"],
976 cd577680 Michael Hanselmann
                                                       dry_run=True))
977 95ab4de9 David Knowles
    self.assertHandler(rlib2.R_2_nodes_name_tags)
978 95ab4de9 David Knowles
    self.assertItems(["node-w"])
979 95ab4de9 David Knowles
    self.assertDryRun()
980 95ab4de9 David Knowles
    self.assertQuery("tag", ["awesome"])
981 95ab4de9 David Knowles
982 a268af8d Adeodato Simo
  def testGetGroups(self):
983 a268af8d Adeodato Simo
    groups = [{"name": "group1",
984 a268af8d Adeodato Simo
               "uri": "/2/groups/group1",
985 a268af8d Adeodato Simo
               },
986 a268af8d Adeodato Simo
              {"name": "group2",
987 a268af8d Adeodato Simo
               "uri": "/2/groups/group2",
988 a268af8d Adeodato Simo
               },
989 a268af8d Adeodato Simo
              ]
990 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(groups))
991 a268af8d Adeodato Simo
    self.assertEqual(["group1", "group2"], self.client.GetGroups())
992 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
993 a268af8d Adeodato Simo
994 a268af8d Adeodato Simo
  def testGetGroupsBulk(self):
995 a268af8d Adeodato Simo
    groups = [{"name": "group1",
996 a268af8d Adeodato Simo
               "uri": "/2/groups/group1",
997 a268af8d Adeodato Simo
               "node_cnt": 2,
998 a268af8d Adeodato Simo
               "node_list": ["gnt1.test",
999 a268af8d Adeodato Simo
                             "gnt2.test",
1000 a268af8d Adeodato Simo
                             ],
1001 a268af8d Adeodato Simo
               },
1002 a268af8d Adeodato Simo
              {"name": "group2",
1003 a268af8d Adeodato Simo
               "uri": "/2/groups/group2",
1004 a268af8d Adeodato Simo
               "node_cnt": 1,
1005 a268af8d Adeodato Simo
               "node_list": ["gnt3.test",
1006 a268af8d Adeodato Simo
                             ],
1007 a268af8d Adeodato Simo
               },
1008 a268af8d Adeodato Simo
              ]
1009 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(groups))
1010 a268af8d Adeodato Simo
1011 a268af8d Adeodato Simo
    self.assertEqual(groups, self.client.GetGroups(bulk=True))
1012 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1013 a268af8d Adeodato Simo
    self.assertBulk()
1014 a268af8d Adeodato Simo
1015 a268af8d Adeodato Simo
  def testGetGroup(self):
1016 a268af8d Adeodato Simo
    group = {"ctime": None,
1017 a268af8d Adeodato Simo
             "name": "default",
1018 a268af8d Adeodato Simo
             }
1019 a268af8d Adeodato Simo
    self.rapi.AddResponse(serializer.DumpJson(group))
1020 a268af8d Adeodato Simo
    self.assertEqual({"ctime": None, "name": "default"},
1021 a268af8d Adeodato Simo
                     self.client.GetGroup("default"))
1022 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name)
1023 a268af8d Adeodato Simo
    self.assertItems(["default"])
1024 a268af8d Adeodato Simo
1025 a268af8d Adeodato Simo
  def testCreateGroup(self):
1026 a268af8d Adeodato Simo
    self.rapi.AddResponse("12345")
1027 a268af8d Adeodato Simo
    job_id = self.client.CreateGroup("newgroup", dry_run=True)
1028 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12345)
1029 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups)
1030 a268af8d Adeodato Simo
    self.assertDryRun()
1031 a268af8d Adeodato Simo
1032 a268af8d Adeodato Simo
  def testDeleteGroup(self):
1033 a268af8d Adeodato Simo
    self.rapi.AddResponse("12346")
1034 a268af8d Adeodato Simo
    job_id = self.client.DeleteGroup("newgroup", dry_run=True)
1035 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12346)
1036 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name)
1037 a268af8d Adeodato Simo
    self.assertDryRun()
1038 a268af8d Adeodato Simo
1039 a268af8d Adeodato Simo
  def testRenameGroup(self):
1040 a268af8d Adeodato Simo
    self.rapi.AddResponse("12347")
1041 a268af8d Adeodato Simo
    job_id = self.client.RenameGroup("oldname", "newname")
1042 a268af8d Adeodato Simo
    self.assertEqual(job_id, 12347)
1043 a268af8d Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_rename)
1044 a268af8d Adeodato Simo
1045 7187e6ff Adeodato Simo
  def testModifyGroup(self):
1046 7187e6ff Adeodato Simo
    self.rapi.AddResponse("12348")
1047 7187e6ff Adeodato Simo
    job_id = self.client.ModifyGroup("mygroup", alloc_policy="foo")
1048 7187e6ff Adeodato Simo
    self.assertEqual(job_id, 12348)
1049 7187e6ff Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_modify)
1050 7187e6ff Adeodato Simo
1051 4245446f Adeodato Simo
  def testAssignGroupNodes(self):
1052 4245446f Adeodato Simo
    self.rapi.AddResponse("12349")
1053 4245446f Adeodato Simo
    job_id = self.client.AssignGroupNodes("mygroup", ["node1", "node2"],
1054 4245446f Adeodato Simo
                                          force=True, dry_run=True)
1055 4245446f Adeodato Simo
    self.assertEqual(job_id, 12349)
1056 4245446f Adeodato Simo
    self.assertHandler(rlib2.R_2_groups_name_assign_nodes)
1057 4245446f Adeodato Simo
    self.assertDryRun()
1058 4245446f Adeodato Simo
    self.assertUseForce()
1059 4245446f Adeodato Simo
1060 62e999a5 Michael Hanselmann
  def testModifyCluster(self):
1061 62e999a5 Michael Hanselmann
    for mnh in [None, False, True]:
1062 62e999a5 Michael Hanselmann
      self.rapi.AddResponse("14470")
1063 62e999a5 Michael Hanselmann
      self.assertEqual(14470,
1064 62e999a5 Michael Hanselmann
        self.client.ModifyCluster(maintain_node_health=mnh))
1065 62e999a5 Michael Hanselmann
      self.assertHandler(rlib2.R_2_cluster_modify)
1066 62e999a5 Michael Hanselmann
      self.assertItems([])
1067 62e999a5 Michael Hanselmann
      data = serializer.LoadJson(self.rapi.GetLastRequestData())
1068 62e999a5 Michael Hanselmann
      self.assertEqual(len(data), 1)
1069 62e999a5 Michael Hanselmann
      self.assertEqual(data["maintain_node_health"], mnh)
1070 62e999a5 Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1071 62e999a5 Michael Hanselmann
1072 e23881ed Michael Hanselmann
  def testGrowInstanceDisk(self):
1073 e23881ed Michael Hanselmann
    for idx, wait_for_sync in enumerate([None, False, True]):
1074 e23881ed Michael Hanselmann
      amount = 128 + (512 * idx)
1075 e23881ed Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1076 e23881ed Michael Hanselmann
      self.rapi.AddResponse("30783")
1077 e23881ed Michael Hanselmann
      self.assertEqual(30783,
1078 e23881ed Michael Hanselmann
        self.client.GrowInstanceDisk("eze8ch", idx, amount,
1079 e23881ed Michael Hanselmann
                                     wait_for_sync=wait_for_sync))
1080 e23881ed Michael Hanselmann
      self.assertHandler(rlib2.R_2_instances_name_disk_grow)
1081 e23881ed Michael Hanselmann
      self.assertItems(["eze8ch", str(idx)])
1082 e23881ed Michael Hanselmann
      data = serializer.LoadJson(self.rapi.GetLastRequestData())
1083 e23881ed Michael Hanselmann
      if wait_for_sync is None:
1084 e23881ed Michael Hanselmann
        self.assertEqual(len(data), 1)
1085 e23881ed Michael Hanselmann
        self.assert_("wait_for_sync" not in data)
1086 e23881ed Michael Hanselmann
      else:
1087 e23881ed Michael Hanselmann
        self.assertEqual(len(data), 2)
1088 e23881ed Michael Hanselmann
        self.assertEqual(data["wait_for_sync"], wait_for_sync)
1089 e23881ed Michael Hanselmann
      self.assertEqual(data["amount"], amount)
1090 e23881ed Michael Hanselmann
      self.assertEqual(self.rapi.CountPending(), 0)
1091 e23881ed Michael Hanselmann
1092 95ab4de9 David Knowles
1093 95ab4de9 David Knowles
if __name__ == '__main__':
1094 2a7c3583 Michael Hanselmann
  client.UsesRapiClient(testutils.GanetiTestProgram)()