Statistics
| Branch: | Tag: | Revision:

root / qa / qa_rapi.py @ c1513c7f

History | View | Annotate | Download (21.6 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 2771835c Michael Hanselmann
41 b459a848 Andrea Spadaccini
import ganeti.rapi.client        # pylint: disable=W0611
42 2771835c Michael Hanselmann
import ganeti.rapi.client_utils
43 a47f574c Oleksiy Mishchenko
44 a47f574c Oleksiy Mishchenko
import qa_config
45 a47f574c Oleksiy Mishchenko
import qa_utils
46 a47f574c Oleksiy Mishchenko
import qa_error
47 a47f574c Oleksiy Mishchenko
48 3582eef6 Iustin Pop
from qa_utils import (AssertEqual, AssertIn, AssertMatch, StartLocalCommand)
49 5fa0375e Michael Hanselmann
from qa_utils import InstanceCheck, INST_DOWN, INST_UP, FIRST_ARG
50 a47f574c Oleksiy Mishchenko
51 a47f574c Oleksiy Mishchenko
52 2771835c Michael Hanselmann
_rapi_ca = None
53 2771835c Michael Hanselmann
_rapi_client = None
54 5d831182 Michael Hanselmann
_rapi_username = None
55 5d831182 Michael Hanselmann
_rapi_password = None
56 e6ce18ac René Nussbaumer
57 e6ce18ac René Nussbaumer
58 2771835c Michael Hanselmann
def Setup(username, password):
59 2771835c Michael Hanselmann
  """Configures the RAPI client.
60 725ec2f1 René Nussbaumer

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

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

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

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

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

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

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

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

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

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

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

647 4c1a464b Iustin Pop
  This must leave the instance with the original name (in the
648 4c1a464b Iustin Pop
  non-failure case).
649 4c1a464b Iustin Pop

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

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