Statistics
| Branch: | Tag: | Revision:

root / qa / qa_rapi.py @ 2e12944a

History | View | Annotate | Download (22.1 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 f346a7d9 Michael Hanselmann
    nic0_mac = qa_config.GetInstanceNicMac(instance,
557 f346a7d9 Michael Hanselmann
                                           default=constants.VALUE_GENERATE)
558 f346a7d9 Michael Hanselmann
    nics = [{
559 f346a7d9 Michael Hanselmann
      constants.INIC_MAC: nic0_mac,
560 f346a7d9 Michael Hanselmann
      }]
561 924e95f9 Michael Hanselmann
562 713a79e7 Michael Hanselmann
    beparams = {
563 8ccbbe4b Guido Trotter
      constants.BE_MAXMEM: utils.ParseUnit(qa_config.get(constants.BE_MAXMEM)),
564 8ccbbe4b Guido Trotter
      constants.BE_MINMEM: utils.ParseUnit(qa_config.get(constants.BE_MINMEM)),
565 713a79e7 Michael Hanselmann
      }
566 924e95f9 Michael Hanselmann
567 713a79e7 Michael Hanselmann
    if use_client:
568 924e95f9 Michael Hanselmann
      job_id = _rapi_client.CreateInstance(constants.INSTANCE_CREATE,
569 924e95f9 Michael Hanselmann
                                           instance["name"],
570 924e95f9 Michael Hanselmann
                                           constants.DT_PLAIN,
571 924e95f9 Michael Hanselmann
                                           disks, nics,
572 924e95f9 Michael Hanselmann
                                           os=qa_config.get("os"),
573 924e95f9 Michael Hanselmann
                                           pnode=node["primary"],
574 924e95f9 Michael Hanselmann
                                           beparams=beparams)
575 924e95f9 Michael Hanselmann
    else:
576 924e95f9 Michael Hanselmann
      body = {
577 713a79e7 Michael Hanselmann
        "__version__": 1,
578 713a79e7 Michael Hanselmann
        "mode": constants.INSTANCE_CREATE,
579 924e95f9 Michael Hanselmann
        "name": instance["name"],
580 713a79e7 Michael Hanselmann
        "os_type": qa_config.get("os"),
581 924e95f9 Michael Hanselmann
        "disk_template": constants.DT_PLAIN,
582 924e95f9 Michael Hanselmann
        "pnode": node["primary"],
583 713a79e7 Michael Hanselmann
        "beparams": beparams,
584 713a79e7 Michael Hanselmann
        "disks": disks,
585 713a79e7 Michael Hanselmann
        "nics": nics,
586 924e95f9 Michael Hanselmann
        }
587 924e95f9 Michael Hanselmann
588 924e95f9 Michael Hanselmann
      (job_id, ) = _DoTests([
589 924e95f9 Michael Hanselmann
        ("/2/instances", _VerifyReturnsJob, "POST", body),
590 924e95f9 Michael Hanselmann
        ])
591 8cb70e56 Michael Hanselmann
592 8cb70e56 Michael Hanselmann
    _WaitForRapiJob(job_id)
593 8cb70e56 Michael Hanselmann
594 8cb70e56 Michael Hanselmann
    return instance
595 8cb70e56 Michael Hanselmann
  except:
596 8cb70e56 Michael Hanselmann
    qa_config.ReleaseInstance(instance)
597 8cb70e56 Michael Hanselmann
    raise
598 8cb70e56 Michael Hanselmann
599 8cb70e56 Michael Hanselmann
600 5fa0375e Michael Hanselmann
@InstanceCheck(None, INST_DOWN, FIRST_ARG)
601 924e95f9 Michael Hanselmann
def TestRapiInstanceRemove(instance, use_client):
602 8cb70e56 Michael Hanselmann
  """Test removing instance via RAPI"""
603 924e95f9 Michael Hanselmann
  if use_client:
604 924e95f9 Michael Hanselmann
    job_id = _rapi_client.DeleteInstance(instance["name"])
605 924e95f9 Michael Hanselmann
  else:
606 924e95f9 Michael Hanselmann
    (job_id, ) = _DoTests([
607 924e95f9 Michael Hanselmann
      ("/2/instances/%s" % instance["name"], _VerifyReturnsJob, "DELETE", None),
608 924e95f9 Michael Hanselmann
      ])
609 8cb70e56 Michael Hanselmann
610 8cb70e56 Michael Hanselmann
  _WaitForRapiJob(job_id)
611 8cb70e56 Michael Hanselmann
612 8cb70e56 Michael Hanselmann
  qa_config.ReleaseInstance(instance)
613 5d831182 Michael Hanselmann
614 5d831182 Michael Hanselmann
615 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
616 938bde86 Michael Hanselmann
def TestRapiInstanceMigrate(instance):
617 938bde86 Michael Hanselmann
  """Test migrating instance via RAPI"""
618 938bde86 Michael Hanselmann
  # Move to secondary node
619 938bde86 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.MigrateInstance(instance["name"]))
620 5fa0375e Michael Hanselmann
  qa_utils.RunInstanceCheck(instance, True)
621 938bde86 Michael Hanselmann
  # And back to previous primary
622 938bde86 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.MigrateInstance(instance["name"]))
623 c0a146a1 Michael Hanselmann
624 c0a146a1 Michael Hanselmann
625 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
626 c0a146a1 Michael Hanselmann
def TestRapiInstanceFailover(instance):
627 c0a146a1 Michael Hanselmann
  """Test failing over instance via RAPI"""
628 c0a146a1 Michael Hanselmann
  # Move to secondary node
629 c0a146a1 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.FailoverInstance(instance["name"]))
630 5fa0375e Michael Hanselmann
  qa_utils.RunInstanceCheck(instance, True)
631 c0a146a1 Michael Hanselmann
  # And back to previous primary
632 c0a146a1 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.FailoverInstance(instance["name"]))
633 a7418448 Michael Hanselmann
634 a7418448 Michael Hanselmann
635 5fa0375e Michael Hanselmann
@InstanceCheck(INST_UP, INST_DOWN, FIRST_ARG)
636 a7418448 Michael Hanselmann
def TestRapiInstanceShutdown(instance):
637 a7418448 Michael Hanselmann
  """Test stopping an instance via RAPI"""
638 a7418448 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.ShutdownInstance(instance["name"]))
639 a7418448 Michael Hanselmann
640 a7418448 Michael Hanselmann
641 5fa0375e Michael Hanselmann
@InstanceCheck(INST_DOWN, INST_UP, FIRST_ARG)
642 a7418448 Michael Hanselmann
def TestRapiInstanceStartup(instance):
643 a7418448 Michael Hanselmann
  """Test starting an instance via RAPI"""
644 a7418448 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.StartupInstance(instance["name"]))
645 938bde86 Michael Hanselmann
646 938bde86 Michael Hanselmann
647 51131cad Michael Hanselmann
@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG)
648 4c1a464b Iustin Pop
def TestRapiInstanceRenameAndBack(rename_source, rename_target):
649 4c1a464b Iustin Pop
  """Test renaming instance via RAPI
650 4c1a464b Iustin Pop

651 4c1a464b Iustin Pop
  This must leave the instance with the original name (in the
652 4c1a464b Iustin Pop
  non-failure case).
653 4c1a464b Iustin Pop

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

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