Statistics
| Branch: | Tag: | Revision:

root / qa / qa_rapi.py @ 741c6d91

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

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

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

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

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

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

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

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

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

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

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

623 4c1a464b Iustin Pop
  This must leave the instance with the original name (in the
624 4c1a464b Iustin Pop
  non-failure case).
625 4c1a464b Iustin Pop

626 4c1a464b Iustin Pop
  """
627 e5c2accd Guido Trotter
  _WaitForRapiJob(_rapi_client.RenameInstance(rename_source, rename_target))
628 4c1a464b Iustin Pop
  _WaitForRapiJob(_rapi_client.RenameInstance(rename_target, rename_source))
629 7fb50870 Michael Hanselmann
630 7fb50870 Michael Hanselmann
631 0220d2cf Guido Trotter
def TestRapiInstanceReinstall(instance):
632 0220d2cf Guido Trotter
  """Test reinstalling an instance via RAPI"""
633 0e265161 Guido Trotter
  _WaitForRapiJob(_rapi_client.ReinstallInstance(instance["name"]))
634 0220d2cf Guido Trotter
635 0220d2cf Guido Trotter
636 539d65ba Michael Hanselmann
def TestRapiInstanceReplaceDisks(instance):
637 539d65ba Michael Hanselmann
  """Test replacing instance disks via RAPI"""
638 539d65ba Michael Hanselmann
  _WaitForRapiJob(_rapi_client.ReplaceInstanceDisks(instance["name"],
639 539d65ba Michael Hanselmann
    mode=constants.REPLACE_DISK_AUTO, disks=[]))
640 539d65ba Michael Hanselmann
  _WaitForRapiJob(_rapi_client.ReplaceInstanceDisks(instance["name"],
641 539d65ba Michael Hanselmann
    mode=constants.REPLACE_DISK_SEC, disks="0"))
642 539d65ba Michael Hanselmann
643 539d65ba Michael Hanselmann
644 3b7158ef Michael Hanselmann
def TestRapiInstanceModify(instance):
645 3b7158ef Michael Hanselmann
  """Test modifying instance via RAPI"""
646 3b7158ef Michael Hanselmann
  def _ModifyInstance(**kwargs):
647 3b7158ef Michael Hanselmann
    _WaitForRapiJob(_rapi_client.ModifyInstance(instance["name"], **kwargs))
648 3b7158ef Michael Hanselmann
649 3b7158ef Michael Hanselmann
  _ModifyInstance(hvparams={
650 3b7158ef Michael Hanselmann
    constants.HV_KERNEL_ARGS: "single",
651 3b7158ef Michael Hanselmann
    })
652 3b7158ef Michael Hanselmann
653 3b7158ef Michael Hanselmann
  _ModifyInstance(beparams={
654 3b7158ef Michael Hanselmann
    constants.BE_VCPUS: 3,
655 3b7158ef Michael Hanselmann
    })
656 3b7158ef Michael Hanselmann
657 3b7158ef Michael Hanselmann
  _ModifyInstance(beparams={
658 3b7158ef Michael Hanselmann
    constants.BE_VCPUS: constants.VALUE_DEFAULT,
659 3b7158ef Michael Hanselmann
    })
660 3b7158ef Michael Hanselmann
661 3b7158ef Michael Hanselmann
  _ModifyInstance(hvparams={
662 3b7158ef Michael Hanselmann
    constants.HV_KERNEL_ARGS: constants.VALUE_DEFAULT,
663 3b7158ef Michael Hanselmann
    })
664 3b7158ef Michael Hanselmann
665 3b7158ef Michael Hanselmann
666 b82d4c5e Michael Hanselmann
def TestRapiInstanceConsole(instance):
667 b82d4c5e Michael Hanselmann
  """Test getting instance console information via RAPI"""
668 b82d4c5e Michael Hanselmann
  result = _rapi_client.GetInstanceConsole(instance["name"])
669 b82d4c5e Michael Hanselmann
  console = objects.InstanceConsole.FromDict(result)
670 b82d4c5e Michael Hanselmann
  AssertEqual(console.Validate(), True)
671 b82d4c5e Michael Hanselmann
  AssertEqual(console.instance, qa_utils.ResolveInstanceName(instance["name"]))
672 b82d4c5e Michael Hanselmann
673 b82d4c5e Michael Hanselmann
674 b82d4c5e Michael Hanselmann
def TestRapiStoppedInstanceConsole(instance):
675 b82d4c5e Michael Hanselmann
  """Test getting stopped instance's console information via RAPI"""
676 b82d4c5e Michael Hanselmann
  try:
677 b82d4c5e Michael Hanselmann
    _rapi_client.GetInstanceConsole(instance["name"])
678 b82d4c5e Michael Hanselmann
  except rapi.client.GanetiApiError, err:
679 b82d4c5e Michael Hanselmann
    AssertEqual(err.code, 503)
680 b82d4c5e Michael Hanselmann
  else:
681 b82d4c5e Michael Hanselmann
    raise qa_error.Error("Getting console for stopped instance didn't"
682 b82d4c5e Michael Hanselmann
                         " return HTTP 503")
683 b82d4c5e Michael Hanselmann
684 b82d4c5e Michael Hanselmann
685 2932dc44 Michael Hanselmann
def GetOperatingSystems():
686 2932dc44 Michael Hanselmann
  """Retrieves a list of all available operating systems.
687 2932dc44 Michael Hanselmann

688 2932dc44 Michael Hanselmann
  """
689 2932dc44 Michael Hanselmann
  return _rapi_client.GetOperatingSystems()
690 2932dc44 Michael Hanselmann
691 2932dc44 Michael Hanselmann
692 638a7266 Iustin Pop
def TestInterClusterInstanceMove(src_instance, dest_instance,
693 638a7266 Iustin Pop
                                 pnode, snode, tnode):
694 5d831182 Michael Hanselmann
  """Test tools/move-instance"""
695 5d831182 Michael Hanselmann
  master = qa_config.GetMasterNode()
696 5d831182 Michael Hanselmann
697 5d831182 Michael Hanselmann
  rapi_pw_file = tempfile.NamedTemporaryFile()
698 5d831182 Michael Hanselmann
  rapi_pw_file.write(_rapi_password)
699 5d831182 Michael Hanselmann
  rapi_pw_file.flush()
700 5d831182 Michael Hanselmann
701 5d831182 Michael Hanselmann
  # TODO: Run some instance tests before moving back
702 677e16eb Iustin Pop
703 638a7266 Iustin Pop
  if snode is None:
704 638a7266 Iustin Pop
    # instance is not redundant, but we still need to pass a node
705 638a7266 Iustin Pop
    # (which will be ignored)
706 638a7266 Iustin Pop
    fsec = tnode
707 638a7266 Iustin Pop
  else:
708 638a7266 Iustin Pop
    fsec = snode
709 638a7266 Iustin Pop
  # note: pnode:snode are the *current* nodes, so we move it first to
710 638a7266 Iustin Pop
  # tnode:pnode, then back to pnode:snode
711 677e16eb Iustin Pop
  for si, di, pn, sn in [(src_instance["name"], dest_instance["name"],
712 638a7266 Iustin Pop
                          tnode["primary"], pnode["primary"]),
713 677e16eb Iustin Pop
                         (dest_instance["name"], src_instance["name"],
714 638a7266 Iustin Pop
                          pnode["primary"], fsec["primary"])]:
715 5d831182 Michael Hanselmann
    cmd = [
716 5d831182 Michael Hanselmann
      "../tools/move-instance",
717 5d831182 Michael Hanselmann
      "--verbose",
718 5d831182 Michael Hanselmann
      "--src-ca-file=%s" % _rapi_ca.name,
719 5d831182 Michael Hanselmann
      "--src-username=%s" % _rapi_username,
720 5d831182 Michael Hanselmann
      "--src-password-file=%s" % rapi_pw_file.name,
721 677e16eb Iustin Pop
      "--dest-instance-name=%s" % di,
722 677e16eb Iustin Pop
      "--dest-primary-node=%s" % pn,
723 677e16eb Iustin Pop
      "--dest-secondary-node=%s" % sn,
724 a889c536 Michael Hanselmann
      "--net=0:mac=%s" % constants.VALUE_GENERATE,
725 5d831182 Michael Hanselmann
      master["primary"],
726 5d831182 Michael Hanselmann
      master["primary"],
727 677e16eb Iustin Pop
      si,
728 5d831182 Michael Hanselmann
      ]
729 5d831182 Michael Hanselmann
730 5d831182 Michael Hanselmann
    AssertEqual(StartLocalCommand(cmd).wait(), 0)