Statistics
| Branch: | Tag: | Revision:

root / qa / qa_rapi.py @ 946e553b

History | View | Annotate | Download (22.2 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 c1513c7f Michael Hanselmann
import re
29 c1513c7f Michael Hanselmann
import itertools
30 a47f574c Oleksiy Mishchenko
31 a47f574c Oleksiy Mishchenko
from ganeti import utils
32 a47f574c Oleksiy Mishchenko
from ganeti import constants
33 a47f574c Oleksiy Mishchenko
from ganeti import errors
34 2771835c Michael Hanselmann
from ganeti import cli
35 2771835c Michael Hanselmann
from ganeti import rapi
36 b82d4c5e Michael Hanselmann
from ganeti import objects
37 4fab7cab Michael Hanselmann
from ganeti import query
38 4fab7cab Michael Hanselmann
from ganeti import compat
39 4fab7cab Michael Hanselmann
from ganeti import qlang
40 304d9f02 Michael Hanselmann
from ganeti import pathutils
41 2771835c Michael Hanselmann
42 b459a848 Andrea Spadaccini
import ganeti.rapi.client        # pylint: disable=W0611
43 2771835c Michael Hanselmann
import ganeti.rapi.client_utils
44 a47f574c Oleksiy Mishchenko
45 a47f574c Oleksiy Mishchenko
import qa_config
46 a47f574c Oleksiy Mishchenko
import qa_utils
47 a47f574c Oleksiy Mishchenko
import qa_error
48 a47f574c Oleksiy Mishchenko
49 3582eef6 Iustin Pop
from qa_utils import (AssertEqual, AssertIn, AssertMatch, StartLocalCommand)
50 5fa0375e Michael Hanselmann
from qa_utils import InstanceCheck, INST_DOWN, INST_UP, FIRST_ARG
51 a47f574c Oleksiy Mishchenko
52 a47f574c Oleksiy Mishchenko
53 2771835c Michael Hanselmann
_rapi_ca = None
54 2771835c Michael Hanselmann
_rapi_client = None
55 5d831182 Michael Hanselmann
_rapi_username = None
56 5d831182 Michael Hanselmann
_rapi_password = None
57 e6ce18ac René Nussbaumer
58 e6ce18ac René Nussbaumer
59 2771835c Michael Hanselmann
def Setup(username, password):
60 2771835c Michael Hanselmann
  """Configures the RAPI client.
61 725ec2f1 René Nussbaumer

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

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

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

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

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

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

403 a47f574c Oleksiy Mishchenko
  """
404 a47f574c Oleksiy Mishchenko
  def _VerifyNode(data):
405 a47f574c Oleksiy Mishchenko
    for entry in NODE_FIELDS:
406 a47f574c Oleksiy Mishchenko
      AssertIn(entry, data)
407 c85d3b64 Michael Hanselmann
408 a47f574c Oleksiy Mishchenko
  def _VerifyNodesList(data):
409 a47f574c Oleksiy Mishchenko
    for node in data:
410 c85d3b64 Michael Hanselmann
      for entry in LIST_FIELDS:
411 a47f574c Oleksiy Mishchenko
        AssertIn(entry, node)
412 c85d3b64 Michael Hanselmann
413 a47f574c Oleksiy Mishchenko
  def _VerifyNodesBulk(data):
414 a47f574c Oleksiy Mishchenko
    for node_data in data:
415 a47f574c Oleksiy Mishchenko
      _VerifyNode(node_data)
416 a47f574c Oleksiy Mishchenko
417 a47f574c Oleksiy Mishchenko
  _DoTests([
418 d0c8c01d Iustin Pop
    ("/2/nodes/%s" % node["primary"], _VerifyNode, "GET", None),
419 d0c8c01d Iustin Pop
    ("/2/nodes", _VerifyNodesList, "GET", None),
420 d0c8c01d Iustin Pop
    ("/2/nodes?bulk=1", _VerifyNodesBulk, "GET", None),
421 a47f574c Oleksiy Mishchenko
    ])
422 a47f574c Oleksiy Mishchenko
423 a47f574c Oleksiy Mishchenko
424 c1513c7f Michael Hanselmann
def _FilterTags(seq):
425 c1513c7f Michael Hanselmann
  """Removes unwanted tags from a sequence.
426 c1513c7f Michael Hanselmann

427 c1513c7f Michael Hanselmann
  """
428 c1513c7f Michael Hanselmann
  ignore_re = qa_config.get("ignore-tags-re", None)
429 c1513c7f Michael Hanselmann
430 c1513c7f Michael Hanselmann
  if ignore_re:
431 c1513c7f Michael Hanselmann
    return itertools.ifilterfalse(re.compile(ignore_re).match, seq)
432 c1513c7f Michael Hanselmann
  else:
433 c1513c7f Michael Hanselmann
    return seq
434 c1513c7f Michael Hanselmann
435 c1513c7f Michael Hanselmann
436 a47f574c Oleksiy Mishchenko
def TestTags(kind, name, tags):
437 a47f574c Oleksiy Mishchenko
  """Tests .../tags resources.
438 a47f574c Oleksiy Mishchenko

439 a47f574c Oleksiy Mishchenko
  """
440 a47f574c Oleksiy Mishchenko
  if kind == constants.TAG_CLUSTER:
441 a5b9d725 Iustin Pop
    uri = "/2/tags"
442 a47f574c Oleksiy Mishchenko
  elif kind == constants.TAG_NODE:
443 a5b9d725 Iustin Pop
    uri = "/2/nodes/%s/tags" % name
444 a47f574c Oleksiy Mishchenko
  elif kind == constants.TAG_INSTANCE:
445 a5b9d725 Iustin Pop
    uri = "/2/instances/%s/tags" % name
446 fe508a9d Michael Hanselmann
  elif kind == constants.TAG_NODEGROUP:
447 fe508a9d Michael Hanselmann
    uri = "/2/groups/%s/tags" % name
448 a47f574c Oleksiy Mishchenko
  else:
449 a47f574c Oleksiy Mishchenko
    raise errors.ProgrammerError("Unknown tag kind")
450 a47f574c Oleksiy Mishchenko
451 a47f574c Oleksiy Mishchenko
  def _VerifyTags(data):
452 c1513c7f Michael Hanselmann
    AssertEqual(sorted(tags), sorted(_FilterTags(data)))
453 a47f574c Oleksiy Mishchenko
454 4fab7cab Michael Hanselmann
  queryargs = "&".join("tag=%s" % i for i in tags)
455 c326b4ef Michael Hanselmann
456 c326b4ef Michael Hanselmann
  # Add tags
457 c326b4ef Michael Hanselmann
  (job_id, ) = _DoTests([
458 4fab7cab Michael Hanselmann
    ("%s?%s" % (uri, queryargs), _VerifyReturnsJob, "PUT", None),
459 c326b4ef Michael Hanselmann
    ])
460 c326b4ef Michael Hanselmann
  _WaitForRapiJob(job_id)
461 c326b4ef Michael Hanselmann
462 c326b4ef Michael Hanselmann
  # Retrieve tags
463 a47f574c Oleksiy Mishchenko
  _DoTests([
464 d0c8c01d Iustin Pop
    (uri, _VerifyTags, "GET", None),
465 a47f574c Oleksiy Mishchenko
    ])
466 8cb70e56 Michael Hanselmann
467 c326b4ef Michael Hanselmann
  # Remove tags
468 c326b4ef Michael Hanselmann
  (job_id, ) = _DoTests([
469 4fab7cab Michael Hanselmann
    ("%s?%s" % (uri, queryargs), _VerifyReturnsJob, "DELETE", None),
470 c326b4ef Michael Hanselmann
    ])
471 c326b4ef Michael Hanselmann
  _WaitForRapiJob(job_id)
472 c326b4ef Michael Hanselmann
473 8cb70e56 Michael Hanselmann
474 8cb70e56 Michael Hanselmann
def _WaitForRapiJob(job_id):
475 8cb70e56 Michael Hanselmann
  """Waits for a job to finish.
476 8cb70e56 Michael Hanselmann

477 8cb70e56 Michael Hanselmann
  """
478 8cb70e56 Michael Hanselmann
  def _VerifyJob(data):
479 8cb70e56 Michael Hanselmann
    AssertEqual(data["id"], job_id)
480 8cb70e56 Michael Hanselmann
    for field in JOB_FIELDS:
481 8cb70e56 Michael Hanselmann
      AssertIn(field, data)
482 8cb70e56 Michael Hanselmann
483 8cb70e56 Michael Hanselmann
  _DoTests([
484 8cb70e56 Michael Hanselmann
    ("/2/jobs/%s" % job_id, _VerifyJob, "GET", None),
485 8cb70e56 Michael Hanselmann
    ])
486 8cb70e56 Michael Hanselmann
487 ebeb600f Michael Hanselmann
  return rapi.client_utils.PollJob(_rapi_client, job_id,
488 ebeb600f Michael Hanselmann
                                   cli.StdioJobPollReportCb())
489 8cb70e56 Michael Hanselmann
490 8cb70e56 Michael Hanselmann
491 4b10fb65 Adeodato Simo
def TestRapiNodeGroups():
492 4b10fb65 Adeodato Simo
  """Test several node group operations using RAPI.
493 4b10fb65 Adeodato Simo

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

654 4c1a464b Iustin Pop
  This must leave the instance with the original name (in the
655 4c1a464b Iustin Pop
  non-failure case).
656 4c1a464b Iustin Pop

657 4c1a464b Iustin Pop
  """
658 e5c2accd Guido Trotter
  _WaitForRapiJob(_rapi_client.RenameInstance(rename_source, rename_target))
659 5fa0375e Michael Hanselmann
  qa_utils.RunInstanceCheck(rename_source, False)
660 51131cad Michael Hanselmann
  qa_utils.RunInstanceCheck(rename_target, False)
661 4c1a464b Iustin Pop
  _WaitForRapiJob(_rapi_client.RenameInstance(rename_target, rename_source))
662 5fa0375e Michael Hanselmann
  qa_utils.RunInstanceCheck(rename_target, False)
663 7fb50870 Michael Hanselmann
664 7fb50870 Michael Hanselmann
665 5fa0375e Michael Hanselmann
@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG)
666 0220d2cf Guido Trotter
def TestRapiInstanceReinstall(instance):
667 0220d2cf Guido Trotter
  """Test reinstalling an instance via RAPI"""
668 0e265161 Guido Trotter
  _WaitForRapiJob(_rapi_client.ReinstallInstance(instance["name"]))
669 51131cad Michael Hanselmann
  # By default, the instance is started again
670 51131cad Michael Hanselmann
  qa_utils.RunInstanceCheck(instance, True)
671 51131cad Michael Hanselmann
672 51131cad Michael Hanselmann
  # Reinstall again without starting
673 51131cad Michael Hanselmann
  _WaitForRapiJob(_rapi_client.ReinstallInstance(instance["name"],
674 51131cad Michael Hanselmann
                                                 no_startup=True))
675 0220d2cf Guido Trotter
676 0220d2cf Guido Trotter
677 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
678 539d65ba Michael Hanselmann
def TestRapiInstanceReplaceDisks(instance):
679 539d65ba Michael Hanselmann
  """Test replacing instance disks via RAPI"""
680 5ae4945a Iustin Pop
  fn = _rapi_client.ReplaceInstanceDisks
681 5ae4945a Iustin Pop
  _WaitForRapiJob(fn(instance["name"],
682 5ae4945a Iustin Pop
                     mode=constants.REPLACE_DISK_AUTO, disks=[]))
683 5ae4945a Iustin Pop
  _WaitForRapiJob(fn(instance["name"],
684 5ae4945a Iustin Pop
                     mode=constants.REPLACE_DISK_SEC, disks="0"))
685 539d65ba Michael Hanselmann
686 539d65ba Michael Hanselmann
687 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
688 3b7158ef Michael Hanselmann
def TestRapiInstanceModify(instance):
689 3b7158ef Michael Hanselmann
  """Test modifying instance via RAPI"""
690 a8dbf746 Michael Hanselmann
  default_hv = qa_config.GetDefaultHypervisor()
691 a8dbf746 Michael Hanselmann
692 3b7158ef Michael Hanselmann
  def _ModifyInstance(**kwargs):
693 3b7158ef Michael Hanselmann
    _WaitForRapiJob(_rapi_client.ModifyInstance(instance["name"], **kwargs))
694 3b7158ef Michael Hanselmann
695 3b7158ef Michael Hanselmann
  _ModifyInstance(beparams={
696 3b7158ef Michael Hanselmann
    constants.BE_VCPUS: 3,
697 3b7158ef Michael Hanselmann
    })
698 3b7158ef Michael Hanselmann
699 3b7158ef Michael Hanselmann
  _ModifyInstance(beparams={
700 3b7158ef Michael Hanselmann
    constants.BE_VCPUS: constants.VALUE_DEFAULT,
701 3b7158ef Michael Hanselmann
    })
702 3b7158ef Michael Hanselmann
703 a8dbf746 Michael Hanselmann
  if default_hv == constants.HT_XEN_PVM:
704 a8dbf746 Michael Hanselmann
    _ModifyInstance(hvparams={
705 a8dbf746 Michael Hanselmann
      constants.HV_KERNEL_ARGS: "single",
706 a8dbf746 Michael Hanselmann
      })
707 a8dbf746 Michael Hanselmann
    _ModifyInstance(hvparams={
708 a8dbf746 Michael Hanselmann
      constants.HV_KERNEL_ARGS: constants.VALUE_DEFAULT,
709 a8dbf746 Michael Hanselmann
      })
710 a8dbf746 Michael Hanselmann
  elif default_hv == constants.HT_XEN_HVM:
711 a8dbf746 Michael Hanselmann
    _ModifyInstance(hvparams={
712 a8dbf746 Michael Hanselmann
      constants.HV_BOOT_ORDER: "acn",
713 a8dbf746 Michael Hanselmann
      })
714 a8dbf746 Michael Hanselmann
    _ModifyInstance(hvparams={
715 a8dbf746 Michael Hanselmann
      constants.HV_BOOT_ORDER: constants.VALUE_DEFAULT,
716 a8dbf746 Michael Hanselmann
      })
717 3b7158ef Michael Hanselmann
718 3b7158ef Michael Hanselmann
719 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
720 b82d4c5e Michael Hanselmann
def TestRapiInstanceConsole(instance):
721 b82d4c5e Michael Hanselmann
  """Test getting instance console information via RAPI"""
722 b82d4c5e Michael Hanselmann
  result = _rapi_client.GetInstanceConsole(instance["name"])
723 b82d4c5e Michael Hanselmann
  console = objects.InstanceConsole.FromDict(result)
724 b82d4c5e Michael Hanselmann
  AssertEqual(console.Validate(), True)
725 b82d4c5e Michael Hanselmann
  AssertEqual(console.instance, qa_utils.ResolveInstanceName(instance["name"]))
726 b82d4c5e Michael Hanselmann
727 b82d4c5e Michael Hanselmann
728 5fa0375e Michael Hanselmann
@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG)
729 b82d4c5e Michael Hanselmann
def TestRapiStoppedInstanceConsole(instance):
730 b82d4c5e Michael Hanselmann
  """Test getting stopped instance's console information via RAPI"""
731 b82d4c5e Michael Hanselmann
  try:
732 b82d4c5e Michael Hanselmann
    _rapi_client.GetInstanceConsole(instance["name"])
733 b82d4c5e Michael Hanselmann
  except rapi.client.GanetiApiError, err:
734 b82d4c5e Michael Hanselmann
    AssertEqual(err.code, 503)
735 b82d4c5e Michael Hanselmann
  else:
736 b82d4c5e Michael Hanselmann
    raise qa_error.Error("Getting console for stopped instance didn't"
737 b82d4c5e Michael Hanselmann
                         " return HTTP 503")
738 b82d4c5e Michael Hanselmann
739 b82d4c5e Michael Hanselmann
740 2932dc44 Michael Hanselmann
def GetOperatingSystems():
741 2932dc44 Michael Hanselmann
  """Retrieves a list of all available operating systems.
742 2932dc44 Michael Hanselmann

743 2932dc44 Michael Hanselmann
  """
744 2932dc44 Michael Hanselmann
  return _rapi_client.GetOperatingSystems()
745 2932dc44 Michael Hanselmann
746 2932dc44 Michael Hanselmann
747 638a7266 Iustin Pop
def TestInterClusterInstanceMove(src_instance, dest_instance,
748 638a7266 Iustin Pop
                                 pnode, snode, tnode):
749 5d831182 Michael Hanselmann
  """Test tools/move-instance"""
750 5d831182 Michael Hanselmann
  master = qa_config.GetMasterNode()
751 5d831182 Michael Hanselmann
752 5d831182 Michael Hanselmann
  rapi_pw_file = tempfile.NamedTemporaryFile()
753 5d831182 Michael Hanselmann
  rapi_pw_file.write(_rapi_password)
754 5d831182 Michael Hanselmann
  rapi_pw_file.flush()
755 5d831182 Michael Hanselmann
756 5d831182 Michael Hanselmann
  # TODO: Run some instance tests before moving back
757 677e16eb Iustin Pop
758 638a7266 Iustin Pop
  if snode is None:
759 638a7266 Iustin Pop
    # instance is not redundant, but we still need to pass a node
760 638a7266 Iustin Pop
    # (which will be ignored)
761 638a7266 Iustin Pop
    fsec = tnode
762 638a7266 Iustin Pop
  else:
763 638a7266 Iustin Pop
    fsec = snode
764 638a7266 Iustin Pop
  # note: pnode:snode are the *current* nodes, so we move it first to
765 638a7266 Iustin Pop
  # tnode:pnode, then back to pnode:snode
766 677e16eb Iustin Pop
  for si, di, pn, sn in [(src_instance["name"], dest_instance["name"],
767 638a7266 Iustin Pop
                          tnode["primary"], pnode["primary"]),
768 677e16eb Iustin Pop
                         (dest_instance["name"], src_instance["name"],
769 638a7266 Iustin Pop
                          pnode["primary"], fsec["primary"])]:
770 5d831182 Michael Hanselmann
    cmd = [
771 5d831182 Michael Hanselmann
      "../tools/move-instance",
772 5d831182 Michael Hanselmann
      "--verbose",
773 5d831182 Michael Hanselmann
      "--src-ca-file=%s" % _rapi_ca.name,
774 5d831182 Michael Hanselmann
      "--src-username=%s" % _rapi_username,
775 5d831182 Michael Hanselmann
      "--src-password-file=%s" % rapi_pw_file.name,
776 677e16eb Iustin Pop
      "--dest-instance-name=%s" % di,
777 677e16eb Iustin Pop
      "--dest-primary-node=%s" % pn,
778 677e16eb Iustin Pop
      "--dest-secondary-node=%s" % sn,
779 a889c536 Michael Hanselmann
      "--net=0:mac=%s" % constants.VALUE_GENERATE,
780 5d831182 Michael Hanselmann
      master["primary"],
781 5d831182 Michael Hanselmann
      master["primary"],
782 677e16eb Iustin Pop
      si,
783 5d831182 Michael Hanselmann
      ]
784 5d831182 Michael Hanselmann
785 5fa0375e Michael Hanselmann
    qa_utils.RunInstanceCheck(di, False)
786 5d831182 Michael Hanselmann
    AssertEqual(StartLocalCommand(cmd).wait(), 0)
787 5fa0375e Michael Hanselmann
    qa_utils.RunInstanceCheck(si, False)
788 5fa0375e Michael Hanselmann
    qa_utils.RunInstanceCheck(di, True)