Statistics
| Branch: | Tag: | Revision:

root / qa / qa_rapi.py @ 51131cad

History | View | Annotate | Download (21.4 kB)

1 a47f574c Oleksiy Mishchenko
#
2 fd7b69c0 Michael Hanselmann
#
3 a47f574c Oleksiy Mishchenko
4 4c1a464b Iustin Pop
# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 Google Inc.
5 a47f574c Oleksiy Mishchenko
#
6 a47f574c Oleksiy Mishchenko
# This program is free software; you can redistribute it and/or modify
7 a47f574c Oleksiy Mishchenko
# it under the terms of the GNU General Public License as published by
8 a47f574c Oleksiy Mishchenko
# the Free Software Foundation; either version 2 of the License, or
9 a47f574c Oleksiy Mishchenko
# (at your option) any later version.
10 a47f574c Oleksiy Mishchenko
#
11 a47f574c Oleksiy Mishchenko
# This program is distributed in the hope that it will be useful, but
12 a47f574c Oleksiy Mishchenko
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a47f574c Oleksiy Mishchenko
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a47f574c Oleksiy Mishchenko
# General Public License for more details.
15 a47f574c Oleksiy Mishchenko
#
16 a47f574c Oleksiy Mishchenko
# You should have received a copy of the GNU General Public License
17 a47f574c Oleksiy Mishchenko
# along with this program; if not, write to the Free Software
18 a47f574c Oleksiy Mishchenko
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a47f574c Oleksiy Mishchenko
# 02110-1301, USA.
20 a47f574c Oleksiy Mishchenko
21 a47f574c Oleksiy Mishchenko
22 a47f574c Oleksiy Mishchenko
"""Remote API QA tests.
23 a47f574c Oleksiy Mishchenko

24 a47f574c Oleksiy Mishchenko
"""
25 a47f574c Oleksiy Mishchenko
26 2771835c Michael Hanselmann
import tempfile
27 4fab7cab Michael Hanselmann
import random
28 a47f574c Oleksiy Mishchenko
29 a47f574c Oleksiy Mishchenko
from ganeti import utils
30 a47f574c Oleksiy Mishchenko
from ganeti import constants
31 a47f574c Oleksiy Mishchenko
from ganeti import errors
32 2771835c Michael Hanselmann
from ganeti import cli
33 2771835c Michael Hanselmann
from ganeti import rapi
34 b82d4c5e Michael Hanselmann
from ganeti import objects
35 4fab7cab Michael Hanselmann
from ganeti import query
36 4fab7cab Michael Hanselmann
from ganeti import compat
37 4fab7cab Michael Hanselmann
from ganeti import qlang
38 2771835c Michael Hanselmann
39 b459a848 Andrea Spadaccini
import ganeti.rapi.client        # pylint: disable=W0611
40 2771835c Michael Hanselmann
import ganeti.rapi.client_utils
41 a47f574c Oleksiy Mishchenko
42 a47f574c Oleksiy Mishchenko
import qa_config
43 a47f574c Oleksiy Mishchenko
import qa_utils
44 a47f574c Oleksiy Mishchenko
import qa_error
45 a47f574c Oleksiy Mishchenko
46 3582eef6 Iustin Pop
from qa_utils import (AssertEqual, AssertIn, AssertMatch, StartLocalCommand)
47 5fa0375e Michael Hanselmann
from qa_utils import InstanceCheck, INST_DOWN, INST_UP, FIRST_ARG
48 a47f574c Oleksiy Mishchenko
49 a47f574c Oleksiy Mishchenko
50 2771835c Michael Hanselmann
_rapi_ca = None
51 2771835c Michael Hanselmann
_rapi_client = None
52 5d831182 Michael Hanselmann
_rapi_username = None
53 5d831182 Michael Hanselmann
_rapi_password = None
54 e6ce18ac René Nussbaumer
55 e6ce18ac René Nussbaumer
56 2771835c Michael Hanselmann
def Setup(username, password):
57 2771835c Michael Hanselmann
  """Configures the RAPI client.
58 725ec2f1 René Nussbaumer

59 2771835c Michael Hanselmann
  """
60 b459a848 Andrea Spadaccini
  # pylint: disable=W0603
61 3582eef6 Iustin Pop
  # due to global usage
62 2771835c Michael Hanselmann
  global _rapi_ca
63 2771835c Michael Hanselmann
  global _rapi_client
64 5d831182 Michael Hanselmann
  global _rapi_username
65 5d831182 Michael Hanselmann
  global _rapi_password
66 5d831182 Michael Hanselmann
67 5d831182 Michael Hanselmann
  _rapi_username = username
68 5d831182 Michael Hanselmann
  _rapi_password = password
69 e6ce18ac René Nussbaumer
70 2771835c Michael Hanselmann
  master = qa_config.GetMasterNode()
71 e6ce18ac René Nussbaumer
72 2771835c Michael Hanselmann
  # Load RAPI certificate from master node
73 2771835c Michael Hanselmann
  cmd = ["cat", constants.RAPI_CERT_FILE]
74 e6ce18ac René Nussbaumer
75 2771835c Michael Hanselmann
  # Write to temporary file
76 2771835c Michael Hanselmann
  _rapi_ca = tempfile.NamedTemporaryFile()
77 2771835c Michael Hanselmann
  _rapi_ca.write(qa_utils.GetCommandOutput(master["primary"],
78 2771835c Michael Hanselmann
                                           utils.ShellQuoteArgs(cmd)))
79 2771835c Michael Hanselmann
  _rapi_ca.flush()
80 e6ce18ac René Nussbaumer
81 2771835c Michael Hanselmann
  port = qa_config.get("rapi-port", default=constants.DEFAULT_RAPI_PORT)
82 2a7c3583 Michael Hanselmann
  cfg_curl = rapi.client.GenericCurlConfig(cafile=_rapi_ca.name,
83 2a7c3583 Michael Hanselmann
                                           proxy="")
84 e6ce18ac René Nussbaumer
85 2771835c Michael Hanselmann
  _rapi_client = rapi.client.GanetiRapiClient(master["primary"], port=port,
86 2771835c Michael Hanselmann
                                              username=username,
87 2771835c Michael Hanselmann
                                              password=password,
88 2a7c3583 Michael Hanselmann
                                              curl_config_fn=cfg_curl)
89 e6ce18ac René Nussbaumer
90 2771835c Michael Hanselmann
  print "RAPI protocol version: %s" % _rapi_client.GetVersion()
91 a47f574c Oleksiy Mishchenko
92 a47f574c Oleksiy Mishchenko
93 a47f574c Oleksiy Mishchenko
INSTANCE_FIELDS = ("name", "os", "pnode", "snodes",
94 a5b9d725 Iustin Pop
                   "admin_state",
95 a5b9d725 Iustin Pop
                   "disk_template", "disk.sizes",
96 22482387 Iustin Pop
                   "nic.ips", "nic.macs", "nic.modes", "nic.links",
97 a5b9d725 Iustin Pop
                   "beparams", "hvparams",
98 4ea3de4e Balazs Lecz
                   "oper_state", "oper_ram", "oper_vcpus", "status", "tags")
99 a47f574c Oleksiy Mishchenko
100 a47f574c Oleksiy Mishchenko
NODE_FIELDS = ("name", "dtotal", "dfree",
101 a47f574c Oleksiy Mishchenko
               "mtotal", "mnode", "mfree",
102 a47f574c Oleksiy Mishchenko
               "pinst_cnt", "sinst_cnt", "tags")
103 a47f574c Oleksiy Mishchenko
104 30131294 Adeodato Simo
GROUP_FIELDS = frozenset([
105 30131294 Adeodato Simo
  "name", "uuid",
106 90e99856 Adeodato Simo
  "alloc_policy",
107 30131294 Adeodato Simo
  "node_cnt", "node_list",
108 30131294 Adeodato Simo
  ])
109 30131294 Adeodato Simo
110 94e63ca1 Michael Hanselmann
JOB_FIELDS = frozenset([
111 94e63ca1 Michael Hanselmann
  "id", "ops", "status", "summary",
112 94e63ca1 Michael Hanselmann
  "opstatus", "opresult", "oplog",
113 94e63ca1 Michael Hanselmann
  "received_ts", "start_ts", "end_ts",
114 94e63ca1 Michael Hanselmann
  ])
115 94e63ca1 Michael Hanselmann
116 68289c75 Iustin Pop
LIST_FIELDS = ("id", "uri")
117 a47f574c Oleksiy Mishchenko
118 a47f574c Oleksiy Mishchenko
119 a47f574c Oleksiy Mishchenko
def Enabled():
120 a47f574c Oleksiy Mishchenko
  """Return whether remote API tests should be run.
121 a47f574c Oleksiy Mishchenko

122 a47f574c Oleksiy Mishchenko
  """
123 d0c8c01d Iustin Pop
  return qa_config.TestEnabled("rapi")
124 a47f574c Oleksiy Mishchenko
125 a47f574c Oleksiy Mishchenko
126 a47f574c Oleksiy Mishchenko
def _DoTests(uris):
127 b459a848 Andrea Spadaccini
  # pylint: disable=W0212
128 3582eef6 Iustin Pop
  # due to _SendRequest usage
129 94e63ca1 Michael Hanselmann
  results = []
130 a47f574c Oleksiy Mishchenko
131 94e63ca1 Michael Hanselmann
  for uri, verify, method, body in uris:
132 a47f574c Oleksiy Mishchenko
    assert uri.startswith("/")
133 a47f574c Oleksiy Mishchenko
134 c326b4ef Michael Hanselmann
    print "%s %s" % (method, uri)
135 2771835c Michael Hanselmann
    data = _rapi_client._SendRequest(method, uri, None, body)
136 a47f574c Oleksiy Mishchenko
137 a47f574c Oleksiy Mishchenko
    if verify is not None:
138 a47f574c Oleksiy Mishchenko
      if callable(verify):
139 a47f574c Oleksiy Mishchenko
        verify(data)
140 a47f574c Oleksiy Mishchenko
      else:
141 a47f574c Oleksiy Mishchenko
        AssertEqual(data, verify)
142 a47f574c Oleksiy Mishchenko
143 fd837171 Michael Hanselmann
    results.append(data)
144 94e63ca1 Michael Hanselmann
145 94e63ca1 Michael Hanselmann
  return results
146 94e63ca1 Michael Hanselmann
147 94e63ca1 Michael Hanselmann
148 94e63ca1 Michael Hanselmann
def _VerifyReturnsJob(data):
149 d0c8c01d Iustin Pop
  AssertMatch(data, r"^\d+$")
150 94e63ca1 Michael Hanselmann
151 a47f574c Oleksiy Mishchenko
152 a47f574c Oleksiy Mishchenko
def TestVersion():
153 a47f574c Oleksiy Mishchenko
  """Testing remote API version.
154 a47f574c Oleksiy Mishchenko

155 a47f574c Oleksiy Mishchenko
  """
156 a47f574c Oleksiy Mishchenko
  _DoTests([
157 d0c8c01d Iustin Pop
    ("/version", constants.RAPI_VERSION, "GET", None),
158 a47f574c Oleksiy Mishchenko
    ])
159 a47f574c Oleksiy Mishchenko
160 a47f574c Oleksiy Mishchenko
161 a47f574c Oleksiy Mishchenko
def TestEmptyCluster():
162 a47f574c Oleksiy Mishchenko
  """Testing remote API on an empty cluster.
163 a47f574c Oleksiy Mishchenko

164 a47f574c Oleksiy Mishchenko
  """
165 94e63ca1 Michael Hanselmann
  master = qa_config.GetMasterNode()
166 94e63ca1 Michael Hanselmann
  master_full = qa_utils.ResolveNodeName(master)
167 a47f574c Oleksiy Mishchenko
168 a47f574c Oleksiy Mishchenko
  def _VerifyInfo(data):
169 a47f574c Oleksiy Mishchenko
    AssertIn("name", data)
170 a47f574c Oleksiy Mishchenko
    AssertIn("master", data)
171 94e63ca1 Michael Hanselmann
    AssertEqual(data["master"], master_full)
172 a47f574c Oleksiy Mishchenko
173 a47f574c Oleksiy Mishchenko
  def _VerifyNodes(data):
174 a47f574c Oleksiy Mishchenko
    master_entry = {
175 94e63ca1 Michael Hanselmann
      "id": master_full,
176 94e63ca1 Michael Hanselmann
      "uri": "/2/nodes/%s" % master_full,
177 a47f574c Oleksiy Mishchenko
      }
178 a47f574c Oleksiy Mishchenko
    AssertIn(master_entry, data)
179 a47f574c Oleksiy Mishchenko
180 a47f574c Oleksiy Mishchenko
  def _VerifyNodesBulk(data):
181 a47f574c Oleksiy Mishchenko
    for node in data:
182 a47f574c Oleksiy Mishchenko
      for entry in NODE_FIELDS:
183 a47f574c Oleksiy Mishchenko
        AssertIn(entry, node)
184 a47f574c Oleksiy Mishchenko
185 30131294 Adeodato Simo
  def _VerifyGroups(data):
186 30131294 Adeodato Simo
    default_group = {
187 75cf411a Adeodato Simo
      "name": constants.INITIAL_NODE_GROUP_NAME,
188 75cf411a Adeodato Simo
      "uri": "/2/groups/" + constants.INITIAL_NODE_GROUP_NAME,
189 30131294 Adeodato Simo
      }
190 30131294 Adeodato Simo
    AssertIn(default_group, data)
191 30131294 Adeodato Simo
192 30131294 Adeodato Simo
  def _VerifyGroupsBulk(data):
193 30131294 Adeodato Simo
    for group in data:
194 30131294 Adeodato Simo
      for field in GROUP_FIELDS:
195 30131294 Adeodato Simo
        AssertIn(field, group)
196 30131294 Adeodato Simo
197 a47f574c Oleksiy Mishchenko
  _DoTests([
198 d0c8c01d Iustin Pop
    ("/", None, "GET", None),
199 d0c8c01d Iustin Pop
    ("/2/info", _VerifyInfo, "GET", None),
200 d0c8c01d Iustin Pop
    ("/2/tags", None, "GET", None),
201 d0c8c01d Iustin Pop
    ("/2/nodes", _VerifyNodes, "GET", None),
202 d0c8c01d Iustin Pop
    ("/2/nodes?bulk=1", _VerifyNodesBulk, "GET", None),
203 d0c8c01d Iustin Pop
    ("/2/groups", _VerifyGroups, "GET", None),
204 d0c8c01d Iustin Pop
    ("/2/groups?bulk=1", _VerifyGroupsBulk, "GET", None),
205 d0c8c01d Iustin Pop
    ("/2/instances", [], "GET", None),
206 d0c8c01d Iustin Pop
    ("/2/instances?bulk=1", [], "GET", None),
207 d0c8c01d Iustin Pop
    ("/2/os", None, "GET", None),
208 a47f574c Oleksiy Mishchenko
    ])
209 a47f574c Oleksiy Mishchenko
210 4d2bd00a Michael Hanselmann
  # Test HTTP Not Found
211 4d2bd00a Michael Hanselmann
  for method in ["GET", "PUT", "POST", "DELETE"]:
212 4d2bd00a Michael Hanselmann
    try:
213 4d2bd00a Michael Hanselmann
      _DoTests([("/99/resource/not/here/99", None, method, None)])
214 4d2bd00a Michael Hanselmann
    except rapi.client.GanetiApiError, err:
215 4d2bd00a Michael Hanselmann
      AssertEqual(err.code, 404)
216 4d2bd00a Michael Hanselmann
    else:
217 4d2bd00a Michael Hanselmann
      raise qa_error.Error("Non-existent resource didn't return HTTP 404")
218 4d2bd00a Michael Hanselmann
219 4d2bd00a Michael Hanselmann
  # Test HTTP Not Implemented
220 4d2bd00a Michael Hanselmann
  for method in ["PUT", "POST", "DELETE"]:
221 4d2bd00a Michael Hanselmann
    try:
222 4d2bd00a Michael Hanselmann
      _DoTests([("/version", None, method, None)])
223 4d2bd00a Michael Hanselmann
    except rapi.client.GanetiApiError, err:
224 4d2bd00a Michael Hanselmann
      AssertEqual(err.code, 501)
225 4d2bd00a Michael Hanselmann
    else:
226 4d2bd00a Michael Hanselmann
      raise qa_error.Error("Non-implemented method didn't fail")
227 4d2bd00a Michael Hanselmann
228 a47f574c Oleksiy Mishchenko
229 4fab7cab Michael Hanselmann
def TestRapiQuery():
230 4fab7cab Michael Hanselmann
  """Testing resource queries via remote API.
231 4fab7cab Michael Hanselmann

232 4fab7cab Michael Hanselmann
  """
233 4fab7cab Michael Hanselmann
  master_name = qa_utils.ResolveNodeName(qa_config.GetMasterNode())
234 4fab7cab Michael Hanselmann
  rnd = random.Random(7818)
235 4fab7cab Michael Hanselmann
236 4fab7cab Michael Hanselmann
  for what in constants.QR_VIA_RAPI:
237 4faa4861 Iustin Pop
    if what == constants.QR_JOB:
238 4faa4861 Iustin Pop
      namefield = "id"
239 496d5ac8 Michael Hanselmann
    elif what == constants.QR_EXPORT:
240 496d5ac8 Michael Hanselmann
      namefield = "export"
241 4faa4861 Iustin Pop
    else:
242 4faa4861 Iustin Pop
      namefield = "name"
243 4faa4861 Iustin Pop
244 4fab7cab Michael Hanselmann
    all_fields = query.ALL_FIELDS[what].keys()
245 4fab7cab Michael Hanselmann
    rnd.shuffle(all_fields)
246 4fab7cab Michael Hanselmann
247 4fab7cab Michael Hanselmann
    # No fields, should return everything
248 4fab7cab Michael Hanselmann
    result = _rapi_client.QueryFields(what)
249 4fab7cab Michael Hanselmann
    qresult = objects.QueryFieldsResponse.FromDict(result)
250 4fab7cab Michael Hanselmann
    AssertEqual(len(qresult.fields), len(all_fields))
251 4fab7cab Michael Hanselmann
252 4fab7cab Michael Hanselmann
    # One field
253 4faa4861 Iustin Pop
    result = _rapi_client.QueryFields(what, fields=[namefield])
254 4fab7cab Michael Hanselmann
    qresult = objects.QueryFieldsResponse.FromDict(result)
255 4fab7cab Michael Hanselmann
    AssertEqual(len(qresult.fields), 1)
256 4fab7cab Michael Hanselmann
257 4fab7cab Michael Hanselmann
    # Specify all fields, order must be correct
258 4fab7cab Michael Hanselmann
    result = _rapi_client.QueryFields(what, fields=all_fields)
259 4fab7cab Michael Hanselmann
    qresult = objects.QueryFieldsResponse.FromDict(result)
260 4fab7cab Michael Hanselmann
    AssertEqual(len(qresult.fields), len(all_fields))
261 4fab7cab Michael Hanselmann
    AssertEqual([fdef.name for fdef in qresult.fields], all_fields)
262 4fab7cab Michael Hanselmann
263 4fab7cab Michael Hanselmann
    # Unknown field
264 4fab7cab Michael Hanselmann
    result = _rapi_client.QueryFields(what, fields=["_unknown!"])
265 4fab7cab Michael Hanselmann
    qresult = objects.QueryFieldsResponse.FromDict(result)
266 4fab7cab Michael Hanselmann
    AssertEqual(len(qresult.fields), 1)
267 4fab7cab Michael Hanselmann
    AssertEqual(qresult.fields[0].name, "_unknown!")
268 4fab7cab Michael Hanselmann
    AssertEqual(qresult.fields[0].kind, constants.QFT_UNKNOWN)
269 4fab7cab Michael Hanselmann
270 4fab7cab Michael Hanselmann
    # Try once more, this time without the client
271 4fab7cab Michael Hanselmann
    _DoTests([
272 4fab7cab Michael Hanselmann
      ("/2/query/%s/fields" % what, None, "GET", None),
273 4fab7cab Michael Hanselmann
      ("/2/query/%s/fields?fields=name,name,%s" % (what, all_fields[0]),
274 4fab7cab Michael Hanselmann
       None, "GET", None),
275 4fab7cab Michael Hanselmann
      ])
276 4fab7cab Michael Hanselmann
277 4fab7cab Michael Hanselmann
    # Try missing query argument
278 4fab7cab Michael Hanselmann
    try:
279 4fab7cab Michael Hanselmann
      _DoTests([
280 4fab7cab Michael Hanselmann
        ("/2/query/%s" % what, None, "GET", None),
281 4fab7cab Michael Hanselmann
        ])
282 4fab7cab Michael Hanselmann
    except rapi.client.GanetiApiError, err:
283 4fab7cab Michael Hanselmann
      AssertEqual(err.code, 400)
284 4fab7cab Michael Hanselmann
    else:
285 4fab7cab Michael Hanselmann
      raise qa_error.Error("Request missing 'fields' parameter didn't fail")
286 4fab7cab Michael Hanselmann
287 4fab7cab Michael Hanselmann
    def _Check(exp_fields, data):
288 4fab7cab Michael Hanselmann
      qresult = objects.QueryResponse.FromDict(data)
289 4fab7cab Michael Hanselmann
      AssertEqual([fdef.name for fdef in qresult.fields], exp_fields)
290 4fab7cab Michael Hanselmann
      if not isinstance(qresult.data, list):
291 4fab7cab Michael Hanselmann
        raise qa_error.Error("Query did not return a list")
292 4fab7cab Michael Hanselmann
293 4fab7cab Michael Hanselmann
    _DoTests([
294 4fab7cab Michael Hanselmann
      # Specify fields in query
295 4fab7cab Michael Hanselmann
      ("/2/query/%s?fields=%s" % (what, ",".join(all_fields)),
296 4fab7cab Michael Hanselmann
       compat.partial(_Check, all_fields), "GET", None),
297 4fab7cab Michael Hanselmann
298 4faa4861 Iustin Pop
      ("/2/query/%s?fields=%s" % (what, namefield),
299 4faa4861 Iustin Pop
       compat.partial(_Check, [namefield]), "GET", None),
300 4fab7cab Michael Hanselmann
301 4fab7cab Michael Hanselmann
      # Note the spaces
302 4faa4861 Iustin Pop
      ("/2/query/%s?fields=%s,%%20%s%%09,%s%%20" %
303 4faa4861 Iustin Pop
       (what, namefield, namefield, namefield),
304 4faa4861 Iustin Pop
       compat.partial(_Check, [namefield] * 3), "GET", None),
305 4fab7cab Michael Hanselmann
306 4fab7cab Michael Hanselmann
      # PUT with fields in query
307 4faa4861 Iustin Pop
      ("/2/query/%s?fields=%s" % (what, namefield),
308 4faa4861 Iustin Pop
       compat.partial(_Check, [namefield]), "PUT", {}),
309 4fab7cab Michael Hanselmann
310 4fab7cab Michael Hanselmann
      # Fields in body
311 4fab7cab Michael Hanselmann
      ("/2/query/%s" % what, compat.partial(_Check, all_fields), "PUT", {
312 4fab7cab Michael Hanselmann
         "fields": all_fields,
313 4fab7cab Michael Hanselmann
         }),
314 4fab7cab Michael Hanselmann
315 4faa4861 Iustin Pop
      ("/2/query/%s" % what, compat.partial(_Check, [namefield] * 4), "PUT", {
316 4faa4861 Iustin Pop
         "fields": [namefield] * 4,
317 4fab7cab Michael Hanselmann
         }),
318 4fab7cab Michael Hanselmann
      ])
319 4fab7cab Michael Hanselmann
320 4fab7cab Michael Hanselmann
    def _CheckFilter():
321 4fab7cab Michael Hanselmann
      _DoTests([
322 4fab7cab Michael Hanselmann
        # With filter
323 4fab7cab Michael Hanselmann
        ("/2/query/%s" % what, compat.partial(_Check, all_fields), "PUT", {
324 4fab7cab Michael Hanselmann
           "fields": all_fields,
325 4faa4861 Iustin Pop
           "filter": [qlang.OP_TRUE, namefield],
326 4fab7cab Michael Hanselmann
           }),
327 4fab7cab Michael Hanselmann
        ])
328 4fab7cab Michael Hanselmann
329 4fab7cab Michael Hanselmann
    if what == constants.QR_LOCK:
330 4fab7cab Michael Hanselmann
      # Locks can't be filtered
331 4fab7cab Michael Hanselmann
      try:
332 4fab7cab Michael Hanselmann
        _CheckFilter()
333 4fab7cab Michael Hanselmann
      except rapi.client.GanetiApiError, err:
334 4fab7cab Michael Hanselmann
        AssertEqual(err.code, 500)
335 4fab7cab Michael Hanselmann
      else:
336 4fab7cab Michael Hanselmann
        raise qa_error.Error("Filtering locks didn't fail")
337 4fab7cab Michael Hanselmann
    else:
338 4fab7cab Michael Hanselmann
      _CheckFilter()
339 4fab7cab Michael Hanselmann
340 4fab7cab Michael Hanselmann
    if what == constants.QR_NODE:
341 4fab7cab Michael Hanselmann
      # Test with filter
342 4fab7cab Michael Hanselmann
      (nodes, ) = _DoTests([("/2/query/%s" % what,
343 4fab7cab Michael Hanselmann
        compat.partial(_Check, ["name", "master"]), "PUT", {
344 4fab7cab Michael Hanselmann
        "fields": ["name", "master"],
345 4fab7cab Michael Hanselmann
        "filter": [qlang.OP_TRUE, "master"],
346 4fab7cab Michael Hanselmann
        })])
347 4fab7cab Michael Hanselmann
      qresult = objects.QueryResponse.FromDict(nodes)
348 4fab7cab Michael Hanselmann
      AssertEqual(qresult.data, [
349 4fab7cab Michael Hanselmann
        [[constants.RS_NORMAL, master_name], [constants.RS_NORMAL, True]],
350 4fab7cab Michael Hanselmann
        ])
351 4fab7cab Michael Hanselmann
352 4fab7cab Michael Hanselmann
353 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
354 a47f574c Oleksiy Mishchenko
def TestInstance(instance):
355 a47f574c Oleksiy Mishchenko
  """Testing getting instance(s) info via remote API.
356 a47f574c Oleksiy Mishchenko

357 a47f574c Oleksiy Mishchenko
  """
358 a47f574c Oleksiy Mishchenko
  def _VerifyInstance(data):
359 a47f574c Oleksiy Mishchenko
    for entry in INSTANCE_FIELDS:
360 a47f574c Oleksiy Mishchenko
      AssertIn(entry, data)
361 c85d3b64 Michael Hanselmann
362 a47f574c Oleksiy Mishchenko
  def _VerifyInstancesList(data):
363 a47f574c Oleksiy Mishchenko
    for instance in data:
364 c85d3b64 Michael Hanselmann
      for entry in LIST_FIELDS:
365 a47f574c Oleksiy Mishchenko
        AssertIn(entry, instance)
366 c85d3b64 Michael Hanselmann
367 a47f574c Oleksiy Mishchenko
  def _VerifyInstancesBulk(data):
368 a47f574c Oleksiy Mishchenko
    for instance_data in data:
369 a47f574c Oleksiy Mishchenko
      _VerifyInstance(instance_data)
370 a47f574c Oleksiy Mishchenko
371 a47f574c Oleksiy Mishchenko
  _DoTests([
372 d0c8c01d Iustin Pop
    ("/2/instances/%s" % instance["name"], _VerifyInstance, "GET", None),
373 d0c8c01d Iustin Pop
    ("/2/instances", _VerifyInstancesList, "GET", None),
374 d0c8c01d Iustin Pop
    ("/2/instances?bulk=1", _VerifyInstancesBulk, "GET", None),
375 94e63ca1 Michael Hanselmann
    ("/2/instances/%s/activate-disks" % instance["name"],
376 d0c8c01d Iustin Pop
     _VerifyReturnsJob, "PUT", None),
377 94e63ca1 Michael Hanselmann
    ("/2/instances/%s/deactivate-disks" % instance["name"],
378 d0c8c01d Iustin Pop
     _VerifyReturnsJob, "PUT", None),
379 a47f574c Oleksiy Mishchenko
    ])
380 a47f574c Oleksiy Mishchenko
381 71910715 Iustin Pop
  # Test OpBackupPrepare
382 ebeb600f Michael Hanselmann
  (job_id, ) = _DoTests([
383 ebeb600f Michael Hanselmann
    ("/2/instances/%s/prepare-export?mode=%s" %
384 ebeb600f Michael Hanselmann
     (instance["name"], constants.EXPORT_MODE_REMOTE),
385 ebeb600f Michael Hanselmann
     _VerifyReturnsJob, "PUT", None),
386 ebeb600f Michael Hanselmann
    ])
387 ebeb600f Michael Hanselmann
388 ebeb600f Michael Hanselmann
  result = _WaitForRapiJob(job_id)[0]
389 ebeb600f Michael Hanselmann
  AssertEqual(len(result["handshake"]), 3)
390 ebeb600f Michael Hanselmann
  AssertEqual(result["handshake"][0], constants.RIE_VERSION)
391 ebeb600f Michael Hanselmann
  AssertEqual(len(result["x509_key_name"]), 3)
392 ebeb600f Michael Hanselmann
  AssertIn("-----BEGIN CERTIFICATE-----", result["x509_ca"])
393 ebeb600f Michael Hanselmann
394 a47f574c Oleksiy Mishchenko
395 a47f574c Oleksiy Mishchenko
def TestNode(node):
396 a47f574c Oleksiy Mishchenko
  """Testing getting node(s) info via remote API.
397 a47f574c Oleksiy Mishchenko

398 a47f574c Oleksiy Mishchenko
  """
399 a47f574c Oleksiy Mishchenko
  def _VerifyNode(data):
400 a47f574c Oleksiy Mishchenko
    for entry in NODE_FIELDS:
401 a47f574c Oleksiy Mishchenko
      AssertIn(entry, data)
402 c85d3b64 Michael Hanselmann
403 a47f574c Oleksiy Mishchenko
  def _VerifyNodesList(data):
404 a47f574c Oleksiy Mishchenko
    for node in data:
405 c85d3b64 Michael Hanselmann
      for entry in LIST_FIELDS:
406 a47f574c Oleksiy Mishchenko
        AssertIn(entry, node)
407 c85d3b64 Michael Hanselmann
408 a47f574c Oleksiy Mishchenko
  def _VerifyNodesBulk(data):
409 a47f574c Oleksiy Mishchenko
    for node_data in data:
410 a47f574c Oleksiy Mishchenko
      _VerifyNode(node_data)
411 a47f574c Oleksiy Mishchenko
412 a47f574c Oleksiy Mishchenko
  _DoTests([
413 d0c8c01d Iustin Pop
    ("/2/nodes/%s" % node["primary"], _VerifyNode, "GET", None),
414 d0c8c01d Iustin Pop
    ("/2/nodes", _VerifyNodesList, "GET", None),
415 d0c8c01d Iustin Pop
    ("/2/nodes?bulk=1", _VerifyNodesBulk, "GET", None),
416 a47f574c Oleksiy Mishchenko
    ])
417 a47f574c Oleksiy Mishchenko
418 a47f574c Oleksiy Mishchenko
419 a47f574c Oleksiy Mishchenko
def TestTags(kind, name, tags):
420 a47f574c Oleksiy Mishchenko
  """Tests .../tags resources.
421 a47f574c Oleksiy Mishchenko

422 a47f574c Oleksiy Mishchenko
  """
423 a47f574c Oleksiy Mishchenko
  if kind == constants.TAG_CLUSTER:
424 a5b9d725 Iustin Pop
    uri = "/2/tags"
425 a47f574c Oleksiy Mishchenko
  elif kind == constants.TAG_NODE:
426 a5b9d725 Iustin Pop
    uri = "/2/nodes/%s/tags" % name
427 a47f574c Oleksiy Mishchenko
  elif kind == constants.TAG_INSTANCE:
428 a5b9d725 Iustin Pop
    uri = "/2/instances/%s/tags" % name
429 fe508a9d Michael Hanselmann
  elif kind == constants.TAG_NODEGROUP:
430 fe508a9d Michael Hanselmann
    uri = "/2/groups/%s/tags" % name
431 a47f574c Oleksiy Mishchenko
  else:
432 a47f574c Oleksiy Mishchenko
    raise errors.ProgrammerError("Unknown tag kind")
433 a47f574c Oleksiy Mishchenko
434 a47f574c Oleksiy Mishchenko
  def _VerifyTags(data):
435 94e63ca1 Michael Hanselmann
    AssertEqual(sorted(tags), sorted(data))
436 a47f574c Oleksiy Mishchenko
437 4fab7cab Michael Hanselmann
  queryargs = "&".join("tag=%s" % i for i in tags)
438 c326b4ef Michael Hanselmann
439 c326b4ef Michael Hanselmann
  # Add tags
440 c326b4ef Michael Hanselmann
  (job_id, ) = _DoTests([
441 4fab7cab Michael Hanselmann
    ("%s?%s" % (uri, queryargs), _VerifyReturnsJob, "PUT", None),
442 c326b4ef Michael Hanselmann
    ])
443 c326b4ef Michael Hanselmann
  _WaitForRapiJob(job_id)
444 c326b4ef Michael Hanselmann
445 c326b4ef Michael Hanselmann
  # Retrieve tags
446 a47f574c Oleksiy Mishchenko
  _DoTests([
447 d0c8c01d Iustin Pop
    (uri, _VerifyTags, "GET", None),
448 a47f574c Oleksiy Mishchenko
    ])
449 8cb70e56 Michael Hanselmann
450 c326b4ef Michael Hanselmann
  # Remove tags
451 c326b4ef Michael Hanselmann
  (job_id, ) = _DoTests([
452 4fab7cab Michael Hanselmann
    ("%s?%s" % (uri, queryargs), _VerifyReturnsJob, "DELETE", None),
453 c326b4ef Michael Hanselmann
    ])
454 c326b4ef Michael Hanselmann
  _WaitForRapiJob(job_id)
455 c326b4ef Michael Hanselmann
456 8cb70e56 Michael Hanselmann
457 8cb70e56 Michael Hanselmann
def _WaitForRapiJob(job_id):
458 8cb70e56 Michael Hanselmann
  """Waits for a job to finish.
459 8cb70e56 Michael Hanselmann

460 8cb70e56 Michael Hanselmann
  """
461 8cb70e56 Michael Hanselmann
  def _VerifyJob(data):
462 8cb70e56 Michael Hanselmann
    AssertEqual(data["id"], job_id)
463 8cb70e56 Michael Hanselmann
    for field in JOB_FIELDS:
464 8cb70e56 Michael Hanselmann
      AssertIn(field, data)
465 8cb70e56 Michael Hanselmann
466 8cb70e56 Michael Hanselmann
  _DoTests([
467 8cb70e56 Michael Hanselmann
    ("/2/jobs/%s" % job_id, _VerifyJob, "GET", None),
468 8cb70e56 Michael Hanselmann
    ])
469 8cb70e56 Michael Hanselmann
470 ebeb600f Michael Hanselmann
  return rapi.client_utils.PollJob(_rapi_client, job_id,
471 ebeb600f Michael Hanselmann
                                   cli.StdioJobPollReportCb())
472 8cb70e56 Michael Hanselmann
473 8cb70e56 Michael Hanselmann
474 4b10fb65 Adeodato Simo
def TestRapiNodeGroups():
475 4b10fb65 Adeodato Simo
  """Test several node group operations using RAPI.
476 4b10fb65 Adeodato Simo

477 4b10fb65 Adeodato Simo
  """
478 4b10fb65 Adeodato Simo
  groups = qa_config.get("groups", {})
479 4b10fb65 Adeodato Simo
  group1, group2, group3 = groups.get("inexistent-groups",
480 4b10fb65 Adeodato Simo
                                      ["group1", "group2", "group3"])[:3]
481 4b10fb65 Adeodato Simo
482 4b10fb65 Adeodato Simo
  # Create a group with no attributes
483 4b10fb65 Adeodato Simo
  body = {
484 4b10fb65 Adeodato Simo
    "name": group1,
485 4b10fb65 Adeodato Simo
    }
486 4b10fb65 Adeodato Simo
487 4b10fb65 Adeodato Simo
  (job_id, ) = _DoTests([
488 4b10fb65 Adeodato Simo
    ("/2/groups", _VerifyReturnsJob, "POST", body),
489 4b10fb65 Adeodato Simo
    ])
490 4b10fb65 Adeodato Simo
491 4b10fb65 Adeodato Simo
  _WaitForRapiJob(job_id)
492 4b10fb65 Adeodato Simo
493 4b10fb65 Adeodato Simo
  # Create a group specifying alloc_policy
494 4b10fb65 Adeodato Simo
  body = {
495 4b10fb65 Adeodato Simo
    "name": group2,
496 4b10fb65 Adeodato Simo
    "alloc_policy": constants.ALLOC_POLICY_UNALLOCABLE,
497 4b10fb65 Adeodato Simo
    }
498 4b10fb65 Adeodato Simo
499 4b10fb65 Adeodato Simo
  (job_id, ) = _DoTests([
500 4b10fb65 Adeodato Simo
    ("/2/groups", _VerifyReturnsJob, "POST", body),
501 4b10fb65 Adeodato Simo
    ])
502 4b10fb65 Adeodato Simo
503 4b10fb65 Adeodato Simo
  _WaitForRapiJob(job_id)
504 4b10fb65 Adeodato Simo
505 4b10fb65 Adeodato Simo
  # Modify alloc_policy
506 4b10fb65 Adeodato Simo
  body = {
507 4b10fb65 Adeodato Simo
    "alloc_policy": constants.ALLOC_POLICY_UNALLOCABLE,
508 4b10fb65 Adeodato Simo
    }
509 4b10fb65 Adeodato Simo
510 4b10fb65 Adeodato Simo
  (job_id, ) = _DoTests([
511 4b10fb65 Adeodato Simo
    ("/2/groups/%s/modify" % group1, _VerifyReturnsJob, "PUT", body),
512 4b10fb65 Adeodato Simo
    ])
513 4b10fb65 Adeodato Simo
514 4b10fb65 Adeodato Simo
  _WaitForRapiJob(job_id)
515 4b10fb65 Adeodato Simo
516 4b10fb65 Adeodato Simo
  # Rename a group
517 4b10fb65 Adeodato Simo
  body = {
518 4b10fb65 Adeodato Simo
    "new_name": group3,
519 4b10fb65 Adeodato Simo
    }
520 4b10fb65 Adeodato Simo
521 4b10fb65 Adeodato Simo
  (job_id, ) = _DoTests([
522 4b10fb65 Adeodato Simo
    ("/2/groups/%s/rename" % group2, _VerifyReturnsJob, "PUT", body),
523 4b10fb65 Adeodato Simo
    ])
524 4b10fb65 Adeodato Simo
525 4b10fb65 Adeodato Simo
  _WaitForRapiJob(job_id)
526 4b10fb65 Adeodato Simo
527 4b10fb65 Adeodato Simo
  # Delete groups
528 4b10fb65 Adeodato Simo
  for group in [group1, group3]:
529 4b10fb65 Adeodato Simo
    (job_id, ) = _DoTests([
530 4b10fb65 Adeodato Simo
      ("/2/groups/%s" % group, _VerifyReturnsJob, "DELETE", None),
531 4b10fb65 Adeodato Simo
      ])
532 4b10fb65 Adeodato Simo
533 4b10fb65 Adeodato Simo
    _WaitForRapiJob(job_id)
534 4b10fb65 Adeodato Simo
535 4b10fb65 Adeodato Simo
536 924e95f9 Michael Hanselmann
def TestRapiInstanceAdd(node, use_client):
537 8cb70e56 Michael Hanselmann
  """Test adding a new instance via RAPI"""
538 8cb70e56 Michael Hanselmann
  instance = qa_config.AcquireInstance()
539 8cb70e56 Michael Hanselmann
  try:
540 924e95f9 Michael Hanselmann
    disk_sizes = [utils.ParseUnit(size) for size in qa_config.get("disk")]
541 713a79e7 Michael Hanselmann
    disks = [{"size": size} for size in disk_sizes]
542 713a79e7 Michael Hanselmann
    nics = [{}]
543 924e95f9 Michael Hanselmann
544 713a79e7 Michael Hanselmann
    beparams = {
545 8ccbbe4b Guido Trotter
      constants.BE_MAXMEM: utils.ParseUnit(qa_config.get(constants.BE_MAXMEM)),
546 8ccbbe4b Guido Trotter
      constants.BE_MINMEM: utils.ParseUnit(qa_config.get(constants.BE_MINMEM)),
547 713a79e7 Michael Hanselmann
      }
548 924e95f9 Michael Hanselmann
549 713a79e7 Michael Hanselmann
    if use_client:
550 924e95f9 Michael Hanselmann
      job_id = _rapi_client.CreateInstance(constants.INSTANCE_CREATE,
551 924e95f9 Michael Hanselmann
                                           instance["name"],
552 924e95f9 Michael Hanselmann
                                           constants.DT_PLAIN,
553 924e95f9 Michael Hanselmann
                                           disks, nics,
554 924e95f9 Michael Hanselmann
                                           os=qa_config.get("os"),
555 924e95f9 Michael Hanselmann
                                           pnode=node["primary"],
556 924e95f9 Michael Hanselmann
                                           beparams=beparams)
557 924e95f9 Michael Hanselmann
    else:
558 924e95f9 Michael Hanselmann
      body = {
559 713a79e7 Michael Hanselmann
        "__version__": 1,
560 713a79e7 Michael Hanselmann
        "mode": constants.INSTANCE_CREATE,
561 924e95f9 Michael Hanselmann
        "name": instance["name"],
562 713a79e7 Michael Hanselmann
        "os_type": qa_config.get("os"),
563 924e95f9 Michael Hanselmann
        "disk_template": constants.DT_PLAIN,
564 924e95f9 Michael Hanselmann
        "pnode": node["primary"],
565 713a79e7 Michael Hanselmann
        "beparams": beparams,
566 713a79e7 Michael Hanselmann
        "disks": disks,
567 713a79e7 Michael Hanselmann
        "nics": nics,
568 924e95f9 Michael Hanselmann
        }
569 924e95f9 Michael Hanselmann
570 924e95f9 Michael Hanselmann
      (job_id, ) = _DoTests([
571 924e95f9 Michael Hanselmann
        ("/2/instances", _VerifyReturnsJob, "POST", body),
572 924e95f9 Michael Hanselmann
        ])
573 8cb70e56 Michael Hanselmann
574 8cb70e56 Michael Hanselmann
    _WaitForRapiJob(job_id)
575 8cb70e56 Michael Hanselmann
576 8cb70e56 Michael Hanselmann
    return instance
577 8cb70e56 Michael Hanselmann
  except:
578 8cb70e56 Michael Hanselmann
    qa_config.ReleaseInstance(instance)
579 8cb70e56 Michael Hanselmann
    raise
580 8cb70e56 Michael Hanselmann
581 8cb70e56 Michael Hanselmann
582 5fa0375e Michael Hanselmann
@InstanceCheck(None, INST_DOWN, FIRST_ARG)
583 924e95f9 Michael Hanselmann
def TestRapiInstanceRemove(instance, use_client):
584 8cb70e56 Michael Hanselmann
  """Test removing instance via RAPI"""
585 924e95f9 Michael Hanselmann
  if use_client:
586 924e95f9 Michael Hanselmann
    job_id = _rapi_client.DeleteInstance(instance["name"])
587 924e95f9 Michael Hanselmann
  else:
588 924e95f9 Michael Hanselmann
    (job_id, ) = _DoTests([
589 924e95f9 Michael Hanselmann
      ("/2/instances/%s" % instance["name"], _VerifyReturnsJob, "DELETE", None),
590 924e95f9 Michael Hanselmann
      ])
591 8cb70e56 Michael Hanselmann
592 8cb70e56 Michael Hanselmann
  _WaitForRapiJob(job_id)
593 8cb70e56 Michael Hanselmann
594 8cb70e56 Michael Hanselmann
  qa_config.ReleaseInstance(instance)
595 5d831182 Michael Hanselmann
596 5d831182 Michael Hanselmann
597 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
598 938bde86 Michael Hanselmann
def TestRapiInstanceMigrate(instance):
599 938bde86 Michael Hanselmann
  """Test migrating instance via RAPI"""
600 938bde86 Michael Hanselmann
  # Move to secondary node
601 938bde86 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.MigrateInstance(instance["name"]))
602 5fa0375e Michael Hanselmann
  qa_utils.RunInstanceCheck(instance, True)
603 938bde86 Michael Hanselmann
  # And back to previous primary
604 938bde86 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.MigrateInstance(instance["name"]))
605 c0a146a1 Michael Hanselmann
606 c0a146a1 Michael Hanselmann
607 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
608 c0a146a1 Michael Hanselmann
def TestRapiInstanceFailover(instance):
609 c0a146a1 Michael Hanselmann
  """Test failing over instance via RAPI"""
610 c0a146a1 Michael Hanselmann
  # Move to secondary node
611 c0a146a1 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.FailoverInstance(instance["name"]))
612 5fa0375e Michael Hanselmann
  qa_utils.RunInstanceCheck(instance, True)
613 c0a146a1 Michael Hanselmann
  # And back to previous primary
614 c0a146a1 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.FailoverInstance(instance["name"]))
615 a7418448 Michael Hanselmann
616 a7418448 Michael Hanselmann
617 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_DOWN, FIRST_ARG)
618 a7418448 Michael Hanselmann
def TestRapiInstanceShutdown(instance):
619 a7418448 Michael Hanselmann
  """Test stopping an instance via RAPI"""
620 a7418448 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.ShutdownInstance(instance["name"]))
621 a7418448 Michael Hanselmann
622 a7418448 Michael Hanselmann
623 5fa0375e Michael Hanselmann
@InstanceCheck(INST_DOWN, INST_UP, FIRST_ARG)
624 a7418448 Michael Hanselmann
def TestRapiInstanceStartup(instance):
625 a7418448 Michael Hanselmann
  """Test starting an instance via RAPI"""
626 a7418448 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.StartupInstance(instance["name"]))
627 938bde86 Michael Hanselmann
628 938bde86 Michael Hanselmann
629 51131cad Michael Hanselmann
@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG)
630 4c1a464b Iustin Pop
def TestRapiInstanceRenameAndBack(rename_source, rename_target):
631 4c1a464b Iustin Pop
  """Test renaming instance via RAPI
632 4c1a464b Iustin Pop

633 4c1a464b Iustin Pop
  This must leave the instance with the original name (in the
634 4c1a464b Iustin Pop
  non-failure case).
635 4c1a464b Iustin Pop

636 4c1a464b Iustin Pop
  """
637 e5c2accd Guido Trotter
  _WaitForRapiJob(_rapi_client.RenameInstance(rename_source, rename_target))
638 5fa0375e Michael Hanselmann
  qa_utils.RunInstanceCheck(rename_source, False)
639 51131cad Michael Hanselmann
  qa_utils.RunInstanceCheck(rename_target, False)
640 4c1a464b Iustin Pop
  _WaitForRapiJob(_rapi_client.RenameInstance(rename_target, rename_source))
641 5fa0375e Michael Hanselmann
  qa_utils.RunInstanceCheck(rename_target, False)
642 7fb50870 Michael Hanselmann
643 7fb50870 Michael Hanselmann
644 5fa0375e Michael Hanselmann
@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG)
645 0220d2cf Guido Trotter
def TestRapiInstanceReinstall(instance):
646 0220d2cf Guido Trotter
  """Test reinstalling an instance via RAPI"""
647 0e265161 Guido Trotter
  _WaitForRapiJob(_rapi_client.ReinstallInstance(instance["name"]))
648 51131cad Michael Hanselmann
  # By default, the instance is started again
649 51131cad Michael Hanselmann
  qa_utils.RunInstanceCheck(instance, True)
650 51131cad Michael Hanselmann
651 51131cad Michael Hanselmann
  # Reinstall again without starting
652 51131cad Michael Hanselmann
  _WaitForRapiJob(_rapi_client.ReinstallInstance(instance["name"],
653 51131cad Michael Hanselmann
                                                 no_startup=True))
654 0220d2cf Guido Trotter
655 0220d2cf Guido Trotter
656 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
657 539d65ba Michael Hanselmann
def TestRapiInstanceReplaceDisks(instance):
658 539d65ba Michael Hanselmann
  """Test replacing instance disks via RAPI"""
659 539d65ba Michael Hanselmann
  _WaitForRapiJob(_rapi_client.ReplaceInstanceDisks(instance["name"],
660 539d65ba Michael Hanselmann
    mode=constants.REPLACE_DISK_AUTO, disks=[]))
661 539d65ba Michael Hanselmann
  _WaitForRapiJob(_rapi_client.ReplaceInstanceDisks(instance["name"],
662 539d65ba Michael Hanselmann
    mode=constants.REPLACE_DISK_SEC, disks="0"))
663 539d65ba Michael Hanselmann
664 539d65ba Michael Hanselmann
665 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
666 3b7158ef Michael Hanselmann
def TestRapiInstanceModify(instance):
667 3b7158ef Michael Hanselmann
  """Test modifying instance via RAPI"""
668 3b7158ef Michael Hanselmann
  def _ModifyInstance(**kwargs):
669 3b7158ef Michael Hanselmann
    _WaitForRapiJob(_rapi_client.ModifyInstance(instance["name"], **kwargs))
670 3b7158ef Michael Hanselmann
671 3b7158ef Michael Hanselmann
  _ModifyInstance(hvparams={
672 3b7158ef Michael Hanselmann
    constants.HV_KERNEL_ARGS: "single",
673 3b7158ef Michael Hanselmann
    })
674 3b7158ef Michael Hanselmann
675 3b7158ef Michael Hanselmann
  _ModifyInstance(beparams={
676 3b7158ef Michael Hanselmann
    constants.BE_VCPUS: 3,
677 3b7158ef Michael Hanselmann
    })
678 3b7158ef Michael Hanselmann
679 3b7158ef Michael Hanselmann
  _ModifyInstance(beparams={
680 3b7158ef Michael Hanselmann
    constants.BE_VCPUS: constants.VALUE_DEFAULT,
681 3b7158ef Michael Hanselmann
    })
682 3b7158ef Michael Hanselmann
683 3b7158ef Michael Hanselmann
  _ModifyInstance(hvparams={
684 3b7158ef Michael Hanselmann
    constants.HV_KERNEL_ARGS: constants.VALUE_DEFAULT,
685 3b7158ef Michael Hanselmann
    })
686 3b7158ef Michael Hanselmann
687 3b7158ef Michael Hanselmann
688 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
689 b82d4c5e Michael Hanselmann
def TestRapiInstanceConsole(instance):
690 b82d4c5e Michael Hanselmann
  """Test getting instance console information via RAPI"""
691 b82d4c5e Michael Hanselmann
  result = _rapi_client.GetInstanceConsole(instance["name"])
692 b82d4c5e Michael Hanselmann
  console = objects.InstanceConsole.FromDict(result)
693 b82d4c5e Michael Hanselmann
  AssertEqual(console.Validate(), True)
694 b82d4c5e Michael Hanselmann
  AssertEqual(console.instance, qa_utils.ResolveInstanceName(instance["name"]))
695 b82d4c5e Michael Hanselmann
696 b82d4c5e Michael Hanselmann
697 5fa0375e Michael Hanselmann
@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG)
698 b82d4c5e Michael Hanselmann
def TestRapiStoppedInstanceConsole(instance):
699 b82d4c5e Michael Hanselmann
  """Test getting stopped instance's console information via RAPI"""
700 b82d4c5e Michael Hanselmann
  try:
701 b82d4c5e Michael Hanselmann
    _rapi_client.GetInstanceConsole(instance["name"])
702 b82d4c5e Michael Hanselmann
  except rapi.client.GanetiApiError, err:
703 b82d4c5e Michael Hanselmann
    AssertEqual(err.code, 503)
704 b82d4c5e Michael Hanselmann
  else:
705 b82d4c5e Michael Hanselmann
    raise qa_error.Error("Getting console for stopped instance didn't"
706 b82d4c5e Michael Hanselmann
                         " return HTTP 503")
707 b82d4c5e Michael Hanselmann
708 b82d4c5e Michael Hanselmann
709 2932dc44 Michael Hanselmann
def GetOperatingSystems():
710 2932dc44 Michael Hanselmann
  """Retrieves a list of all available operating systems.
711 2932dc44 Michael Hanselmann

712 2932dc44 Michael Hanselmann
  """
713 2932dc44 Michael Hanselmann
  return _rapi_client.GetOperatingSystems()
714 2932dc44 Michael Hanselmann
715 2932dc44 Michael Hanselmann
716 638a7266 Iustin Pop
def TestInterClusterInstanceMove(src_instance, dest_instance,
717 638a7266 Iustin Pop
                                 pnode, snode, tnode):
718 5d831182 Michael Hanselmann
  """Test tools/move-instance"""
719 5d831182 Michael Hanselmann
  master = qa_config.GetMasterNode()
720 5d831182 Michael Hanselmann
721 5d831182 Michael Hanselmann
  rapi_pw_file = tempfile.NamedTemporaryFile()
722 5d831182 Michael Hanselmann
  rapi_pw_file.write(_rapi_password)
723 5d831182 Michael Hanselmann
  rapi_pw_file.flush()
724 5d831182 Michael Hanselmann
725 5d831182 Michael Hanselmann
  # TODO: Run some instance tests before moving back
726 677e16eb Iustin Pop
727 638a7266 Iustin Pop
  if snode is None:
728 638a7266 Iustin Pop
    # instance is not redundant, but we still need to pass a node
729 638a7266 Iustin Pop
    # (which will be ignored)
730 638a7266 Iustin Pop
    fsec = tnode
731 638a7266 Iustin Pop
  else:
732 638a7266 Iustin Pop
    fsec = snode
733 638a7266 Iustin Pop
  # note: pnode:snode are the *current* nodes, so we move it first to
734 638a7266 Iustin Pop
  # tnode:pnode, then back to pnode:snode
735 677e16eb Iustin Pop
  for si, di, pn, sn in [(src_instance["name"], dest_instance["name"],
736 638a7266 Iustin Pop
                          tnode["primary"], pnode["primary"]),
737 677e16eb Iustin Pop
                         (dest_instance["name"], src_instance["name"],
738 638a7266 Iustin Pop
                          pnode["primary"], fsec["primary"])]:
739 5d831182 Michael Hanselmann
    cmd = [
740 5d831182 Michael Hanselmann
      "../tools/move-instance",
741 5d831182 Michael Hanselmann
      "--verbose",
742 5d831182 Michael Hanselmann
      "--src-ca-file=%s" % _rapi_ca.name,
743 5d831182 Michael Hanselmann
      "--src-username=%s" % _rapi_username,
744 5d831182 Michael Hanselmann
      "--src-password-file=%s" % rapi_pw_file.name,
745 677e16eb Iustin Pop
      "--dest-instance-name=%s" % di,
746 677e16eb Iustin Pop
      "--dest-primary-node=%s" % pn,
747 677e16eb Iustin Pop
      "--dest-secondary-node=%s" % sn,
748 a889c536 Michael Hanselmann
      "--net=0:mac=%s" % constants.VALUE_GENERATE,
749 5d831182 Michael Hanselmann
      master["primary"],
750 5d831182 Michael Hanselmann
      master["primary"],
751 677e16eb Iustin Pop
      si,
752 5d831182 Michael Hanselmann
      ]
753 5d831182 Michael Hanselmann
754 5fa0375e Michael Hanselmann
    qa_utils.RunInstanceCheck(di, False)
755 5d831182 Michael Hanselmann
    AssertEqual(StartLocalCommand(cmd).wait(), 0)
756 5fa0375e Michael Hanselmann
    qa_utils.RunInstanceCheck(si, False)
757 5fa0375e Michael Hanselmann
    qa_utils.RunInstanceCheck(di, True)