Statistics
| Branch: | Tag: | Revision:

root / qa / qa_rapi.py @ d27150a9

History | View | Annotate | Download (12.1 kB)

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

23 a47f574c Oleksiy Mishchenko
"""
24 a47f574c Oleksiy Mishchenko
25 2771835c Michael Hanselmann
import tempfile
26 a47f574c Oleksiy Mishchenko
27 a47f574c Oleksiy Mishchenko
from ganeti import utils
28 a47f574c Oleksiy Mishchenko
from ganeti import constants
29 a47f574c Oleksiy Mishchenko
from ganeti import errors
30 a47f574c Oleksiy Mishchenko
from ganeti import serializer
31 2771835c Michael Hanselmann
from ganeti import cli
32 2771835c Michael Hanselmann
from ganeti import rapi
33 2771835c Michael Hanselmann
34 2771835c Michael Hanselmann
import ganeti.rapi.client
35 2771835c Michael Hanselmann
import ganeti.rapi.client_utils
36 a47f574c Oleksiy Mishchenko
37 a47f574c Oleksiy Mishchenko
import qa_config
38 a47f574c Oleksiy Mishchenko
import qa_utils
39 a47f574c Oleksiy Mishchenko
import qa_error
40 a47f574c Oleksiy Mishchenko
41 e6ce18ac René Nussbaumer
from qa_utils import (AssertEqual, AssertNotEqual, AssertIn, AssertMatch,
42 5d831182 Michael Hanselmann
                      StartLocalCommand)
43 a47f574c Oleksiy Mishchenko
44 a47f574c Oleksiy Mishchenko
45 2771835c Michael Hanselmann
_rapi_ca = None
46 2771835c Michael Hanselmann
_rapi_client = None
47 5d831182 Michael Hanselmann
_rapi_username = None
48 5d831182 Michael Hanselmann
_rapi_password = None
49 e6ce18ac René Nussbaumer
50 e6ce18ac René Nussbaumer
51 2771835c Michael Hanselmann
def Setup(username, password):
52 2771835c Michael Hanselmann
  """Configures the RAPI client.
53 725ec2f1 René Nussbaumer

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

109 a47f574c Oleksiy Mishchenko
  """
110 e1876432 Guido Trotter
  return qa_config.TestEnabled('rapi')
111 a47f574c Oleksiy Mishchenko
112 a47f574c Oleksiy Mishchenko
113 a47f574c Oleksiy Mishchenko
def _DoTests(uris):
114 94e63ca1 Michael Hanselmann
  results = []
115 a47f574c Oleksiy Mishchenko
116 94e63ca1 Michael Hanselmann
  for uri, verify, method, body in uris:
117 a47f574c Oleksiy Mishchenko
    assert uri.startswith("/")
118 a47f574c Oleksiy Mishchenko
119 c326b4ef Michael Hanselmann
    print "%s %s" % (method, uri)
120 2771835c Michael Hanselmann
    data = _rapi_client._SendRequest(method, uri, None, body)
121 a47f574c Oleksiy Mishchenko
122 a47f574c Oleksiy Mishchenko
    if verify is not None:
123 a47f574c Oleksiy Mishchenko
      if callable(verify):
124 a47f574c Oleksiy Mishchenko
        verify(data)
125 a47f574c Oleksiy Mishchenko
      else:
126 a47f574c Oleksiy Mishchenko
        AssertEqual(data, verify)
127 a47f574c Oleksiy Mishchenko
128 fd837171 Michael Hanselmann
    results.append(data)
129 94e63ca1 Michael Hanselmann
130 94e63ca1 Michael Hanselmann
  return results
131 94e63ca1 Michael Hanselmann
132 94e63ca1 Michael Hanselmann
133 94e63ca1 Michael Hanselmann
def _VerifyReturnsJob(data):
134 94e63ca1 Michael Hanselmann
  AssertMatch(data, r'^\d+$')
135 94e63ca1 Michael Hanselmann
136 a47f574c Oleksiy Mishchenko
137 a47f574c Oleksiy Mishchenko
def TestVersion():
138 a47f574c Oleksiy Mishchenko
  """Testing remote API version.
139 a47f574c Oleksiy Mishchenko

140 a47f574c Oleksiy Mishchenko
  """
141 a47f574c Oleksiy Mishchenko
  _DoTests([
142 94e63ca1 Michael Hanselmann
    ("/version", constants.RAPI_VERSION, 'GET', None),
143 a47f574c Oleksiy Mishchenko
    ])
144 a47f574c Oleksiy Mishchenko
145 a47f574c Oleksiy Mishchenko
146 a47f574c Oleksiy Mishchenko
def TestEmptyCluster():
147 a47f574c Oleksiy Mishchenko
  """Testing remote API on an empty cluster.
148 a47f574c Oleksiy Mishchenko

149 a47f574c Oleksiy Mishchenko
  """
150 94e63ca1 Michael Hanselmann
  master = qa_config.GetMasterNode()
151 94e63ca1 Michael Hanselmann
  master_full = qa_utils.ResolveNodeName(master)
152 a47f574c Oleksiy Mishchenko
153 a47f574c Oleksiy Mishchenko
  def _VerifyInfo(data):
154 a47f574c Oleksiy Mishchenko
    AssertIn("name", data)
155 a47f574c Oleksiy Mishchenko
    AssertIn("master", data)
156 94e63ca1 Michael Hanselmann
    AssertEqual(data["master"], master_full)
157 a47f574c Oleksiy Mishchenko
158 a47f574c Oleksiy Mishchenko
  def _VerifyNodes(data):
159 a47f574c Oleksiy Mishchenko
    master_entry = {
160 94e63ca1 Michael Hanselmann
      "id": master_full,
161 94e63ca1 Michael Hanselmann
      "uri": "/2/nodes/%s" % master_full,
162 a47f574c Oleksiy Mishchenko
      }
163 a47f574c Oleksiy Mishchenko
    AssertIn(master_entry, data)
164 a47f574c Oleksiy Mishchenko
165 a47f574c Oleksiy Mishchenko
  def _VerifyNodesBulk(data):
166 a47f574c Oleksiy Mishchenko
    for node in data:
167 a47f574c Oleksiy Mishchenko
      for entry in NODE_FIELDS:
168 a47f574c Oleksiy Mishchenko
        AssertIn(entry, node)
169 a47f574c Oleksiy Mishchenko
170 a47f574c Oleksiy Mishchenko
  _DoTests([
171 94e63ca1 Michael Hanselmann
    ("/", None, 'GET', None),
172 94e63ca1 Michael Hanselmann
    ("/2/info", _VerifyInfo, 'GET', None),
173 94e63ca1 Michael Hanselmann
    ("/2/tags", None, 'GET', None),
174 94e63ca1 Michael Hanselmann
    ("/2/nodes", _VerifyNodes, 'GET', None),
175 94e63ca1 Michael Hanselmann
    ("/2/nodes?bulk=1", _VerifyNodesBulk, 'GET', None),
176 94e63ca1 Michael Hanselmann
    ("/2/instances", [], 'GET', None),
177 94e63ca1 Michael Hanselmann
    ("/2/instances?bulk=1", [], 'GET', None),
178 94e63ca1 Michael Hanselmann
    ("/2/os", None, 'GET', None),
179 a47f574c Oleksiy Mishchenko
    ])
180 a47f574c Oleksiy Mishchenko
181 4d2bd00a Michael Hanselmann
  # Test HTTP Not Found
182 4d2bd00a Michael Hanselmann
  for method in ["GET", "PUT", "POST", "DELETE"]:
183 4d2bd00a Michael Hanselmann
    try:
184 4d2bd00a Michael Hanselmann
      _DoTests([("/99/resource/not/here/99", None, method, None)])
185 4d2bd00a Michael Hanselmann
    except rapi.client.GanetiApiError, err:
186 4d2bd00a Michael Hanselmann
      AssertEqual(err.code, 404)
187 4d2bd00a Michael Hanselmann
    else:
188 4d2bd00a Michael Hanselmann
      raise qa_error.Error("Non-existent resource didn't return HTTP 404")
189 4d2bd00a Michael Hanselmann
190 4d2bd00a Michael Hanselmann
  # Test HTTP Not Implemented
191 4d2bd00a Michael Hanselmann
  for method in ["PUT", "POST", "DELETE"]:
192 4d2bd00a Michael Hanselmann
    try:
193 4d2bd00a Michael Hanselmann
      _DoTests([("/version", None, method, None)])
194 4d2bd00a Michael Hanselmann
    except rapi.client.GanetiApiError, err:
195 4d2bd00a Michael Hanselmann
      AssertEqual(err.code, 501)
196 4d2bd00a Michael Hanselmann
    else:
197 4d2bd00a Michael Hanselmann
      raise qa_error.Error("Non-implemented method didn't fail")
198 4d2bd00a Michael Hanselmann
199 a47f574c Oleksiy Mishchenko
200 a47f574c Oleksiy Mishchenko
def TestInstance(instance):
201 a47f574c Oleksiy Mishchenko
  """Testing getting instance(s) info via remote API.
202 a47f574c Oleksiy Mishchenko

203 a47f574c Oleksiy Mishchenko
  """
204 a47f574c Oleksiy Mishchenko
  def _VerifyInstance(data):
205 a47f574c Oleksiy Mishchenko
    for entry in INSTANCE_FIELDS:
206 a47f574c Oleksiy Mishchenko
      AssertIn(entry, data)
207 c85d3b64 Michael Hanselmann
208 a47f574c Oleksiy Mishchenko
  def _VerifyInstancesList(data):
209 a47f574c Oleksiy Mishchenko
    for instance in data:
210 c85d3b64 Michael Hanselmann
      for entry in LIST_FIELDS:
211 a47f574c Oleksiy Mishchenko
        AssertIn(entry, instance)
212 c85d3b64 Michael Hanselmann
213 a47f574c Oleksiy Mishchenko
  def _VerifyInstancesBulk(data):
214 a47f574c Oleksiy Mishchenko
    for instance_data in data:
215 a47f574c Oleksiy Mishchenko
      _VerifyInstance(instance_data)
216 a47f574c Oleksiy Mishchenko
217 a47f574c Oleksiy Mishchenko
  _DoTests([
218 94e63ca1 Michael Hanselmann
    ("/2/instances/%s" % instance["name"], _VerifyInstance, 'GET', None),
219 94e63ca1 Michael Hanselmann
    ("/2/instances", _VerifyInstancesList, 'GET', None),
220 94e63ca1 Michael Hanselmann
    ("/2/instances?bulk=1", _VerifyInstancesBulk, 'GET', None),
221 94e63ca1 Michael Hanselmann
    ("/2/instances/%s/activate-disks" % instance["name"],
222 94e63ca1 Michael Hanselmann
     _VerifyReturnsJob, 'PUT', None),
223 94e63ca1 Michael Hanselmann
    ("/2/instances/%s/deactivate-disks" % instance["name"],
224 94e63ca1 Michael Hanselmann
     _VerifyReturnsJob, 'PUT', None),
225 a47f574c Oleksiy Mishchenko
    ])
226 a47f574c Oleksiy Mishchenko
227 ebeb600f Michael Hanselmann
  # Test OpPrepareExport
228 ebeb600f Michael Hanselmann
  (job_id, ) = _DoTests([
229 ebeb600f Michael Hanselmann
    ("/2/instances/%s/prepare-export?mode=%s" %
230 ebeb600f Michael Hanselmann
     (instance["name"], constants.EXPORT_MODE_REMOTE),
231 ebeb600f Michael Hanselmann
     _VerifyReturnsJob, "PUT", None),
232 ebeb600f Michael Hanselmann
    ])
233 ebeb600f Michael Hanselmann
234 ebeb600f Michael Hanselmann
  result = _WaitForRapiJob(job_id)[0]
235 ebeb600f Michael Hanselmann
  AssertEqual(len(result["handshake"]), 3)
236 ebeb600f Michael Hanselmann
  AssertEqual(result["handshake"][0], constants.RIE_VERSION)
237 ebeb600f Michael Hanselmann
  AssertEqual(len(result["x509_key_name"]), 3)
238 ebeb600f Michael Hanselmann
  AssertIn("-----BEGIN CERTIFICATE-----", result["x509_ca"])
239 ebeb600f Michael Hanselmann
240 a47f574c Oleksiy Mishchenko
241 a47f574c Oleksiy Mishchenko
def TestNode(node):
242 a47f574c Oleksiy Mishchenko
  """Testing getting node(s) info via remote API.
243 a47f574c Oleksiy Mishchenko

244 a47f574c Oleksiy Mishchenko
  """
245 a47f574c Oleksiy Mishchenko
  def _VerifyNode(data):
246 a47f574c Oleksiy Mishchenko
    for entry in NODE_FIELDS:
247 a47f574c Oleksiy Mishchenko
      AssertIn(entry, data)
248 c85d3b64 Michael Hanselmann
249 a47f574c Oleksiy Mishchenko
  def _VerifyNodesList(data):
250 a47f574c Oleksiy Mishchenko
    for node in data:
251 c85d3b64 Michael Hanselmann
      for entry in LIST_FIELDS:
252 a47f574c Oleksiy Mishchenko
        AssertIn(entry, node)
253 c85d3b64 Michael Hanselmann
254 a47f574c Oleksiy Mishchenko
  def _VerifyNodesBulk(data):
255 a47f574c Oleksiy Mishchenko
    for node_data in data:
256 a47f574c Oleksiy Mishchenko
      _VerifyNode(node_data)
257 a47f574c Oleksiy Mishchenko
258 a47f574c Oleksiy Mishchenko
  _DoTests([
259 94e63ca1 Michael Hanselmann
    ("/2/nodes/%s" % node["primary"], _VerifyNode, 'GET', None),
260 94e63ca1 Michael Hanselmann
    ("/2/nodes", _VerifyNodesList, 'GET', None),
261 94e63ca1 Michael Hanselmann
    ("/2/nodes?bulk=1", _VerifyNodesBulk, 'GET', None),
262 a47f574c Oleksiy Mishchenko
    ])
263 a47f574c Oleksiy Mishchenko
264 a47f574c Oleksiy Mishchenko
265 a47f574c Oleksiy Mishchenko
def TestTags(kind, name, tags):
266 a47f574c Oleksiy Mishchenko
  """Tests .../tags resources.
267 a47f574c Oleksiy Mishchenko

268 a47f574c Oleksiy Mishchenko
  """
269 a47f574c Oleksiy Mishchenko
  if kind == constants.TAG_CLUSTER:
270 a5b9d725 Iustin Pop
    uri = "/2/tags"
271 a47f574c Oleksiy Mishchenko
  elif kind == constants.TAG_NODE:
272 a5b9d725 Iustin Pop
    uri = "/2/nodes/%s/tags" % name
273 a47f574c Oleksiy Mishchenko
  elif kind == constants.TAG_INSTANCE:
274 a5b9d725 Iustin Pop
    uri = "/2/instances/%s/tags" % name
275 a47f574c Oleksiy Mishchenko
  else:
276 a47f574c Oleksiy Mishchenko
    raise errors.ProgrammerError("Unknown tag kind")
277 a47f574c Oleksiy Mishchenko
278 a47f574c Oleksiy Mishchenko
  def _VerifyTags(data):
279 94e63ca1 Michael Hanselmann
    AssertEqual(sorted(tags), sorted(data))
280 a47f574c Oleksiy Mishchenko
281 c326b4ef Michael Hanselmann
  query = "&".join("tag=%s" % i for i in tags)
282 c326b4ef Michael Hanselmann
283 c326b4ef Michael Hanselmann
  # Add tags
284 c326b4ef Michael Hanselmann
  (job_id, ) = _DoTests([
285 c326b4ef Michael Hanselmann
    ("%s?%s" % (uri, query), _VerifyReturnsJob, "PUT", None),
286 c326b4ef Michael Hanselmann
    ])
287 c326b4ef Michael Hanselmann
  _WaitForRapiJob(job_id)
288 c326b4ef Michael Hanselmann
289 c326b4ef Michael Hanselmann
  # Retrieve tags
290 a47f574c Oleksiy Mishchenko
  _DoTests([
291 94e63ca1 Michael Hanselmann
    (uri, _VerifyTags, 'GET', None),
292 a47f574c Oleksiy Mishchenko
    ])
293 8cb70e56 Michael Hanselmann
294 c326b4ef Michael Hanselmann
  # Remove tags
295 c326b4ef Michael Hanselmann
  (job_id, ) = _DoTests([
296 c326b4ef Michael Hanselmann
    ("%s?%s" % (uri, query), _VerifyReturnsJob, "DELETE", None),
297 c326b4ef Michael Hanselmann
    ])
298 c326b4ef Michael Hanselmann
  _WaitForRapiJob(job_id)
299 c326b4ef Michael Hanselmann
300 8cb70e56 Michael Hanselmann
301 8cb70e56 Michael Hanselmann
def _WaitForRapiJob(job_id):
302 8cb70e56 Michael Hanselmann
  """Waits for a job to finish.
303 8cb70e56 Michael Hanselmann

304 8cb70e56 Michael Hanselmann
  """
305 8cb70e56 Michael Hanselmann
  master = qa_config.GetMasterNode()
306 8cb70e56 Michael Hanselmann
307 8cb70e56 Michael Hanselmann
  def _VerifyJob(data):
308 8cb70e56 Michael Hanselmann
    AssertEqual(data["id"], job_id)
309 8cb70e56 Michael Hanselmann
    for field in JOB_FIELDS:
310 8cb70e56 Michael Hanselmann
      AssertIn(field, data)
311 8cb70e56 Michael Hanselmann
312 8cb70e56 Michael Hanselmann
  _DoTests([
313 8cb70e56 Michael Hanselmann
    ("/2/jobs/%s" % job_id, _VerifyJob, "GET", None),
314 8cb70e56 Michael Hanselmann
    ])
315 8cb70e56 Michael Hanselmann
316 ebeb600f Michael Hanselmann
  return rapi.client_utils.PollJob(_rapi_client, job_id,
317 ebeb600f Michael Hanselmann
                                   cli.StdioJobPollReportCb())
318 8cb70e56 Michael Hanselmann
319 8cb70e56 Michael Hanselmann
320 924e95f9 Michael Hanselmann
def TestRapiInstanceAdd(node, use_client):
321 8cb70e56 Michael Hanselmann
  """Test adding a new instance via RAPI"""
322 8cb70e56 Michael Hanselmann
  instance = qa_config.AcquireInstance()
323 8cb70e56 Michael Hanselmann
  try:
324 924e95f9 Michael Hanselmann
    memory = utils.ParseUnit(qa_config.get("mem"))
325 924e95f9 Michael Hanselmann
    disk_sizes = [utils.ParseUnit(size) for size in qa_config.get("disk")]
326 924e95f9 Michael Hanselmann
327 924e95f9 Michael Hanselmann
    if use_client:
328 924e95f9 Michael Hanselmann
      disks = [{"size": size} for size in disk_sizes]
329 924e95f9 Michael Hanselmann
      nics = [{}]
330 924e95f9 Michael Hanselmann
331 924e95f9 Michael Hanselmann
      beparams = {
332 924e95f9 Michael Hanselmann
        constants.BE_MEMORY: memory,
333 924e95f9 Michael Hanselmann
        }
334 924e95f9 Michael Hanselmann
335 924e95f9 Michael Hanselmann
      job_id = _rapi_client.CreateInstance(constants.INSTANCE_CREATE,
336 924e95f9 Michael Hanselmann
                                           instance["name"],
337 924e95f9 Michael Hanselmann
                                           constants.DT_PLAIN,
338 924e95f9 Michael Hanselmann
                                           disks, nics,
339 924e95f9 Michael Hanselmann
                                           os=qa_config.get("os"),
340 924e95f9 Michael Hanselmann
                                           pnode=node["primary"],
341 924e95f9 Michael Hanselmann
                                           beparams=beparams)
342 924e95f9 Michael Hanselmann
    else:
343 924e95f9 Michael Hanselmann
      body = {
344 924e95f9 Michael Hanselmann
        "name": instance["name"],
345 924e95f9 Michael Hanselmann
        "os": qa_config.get("os"),
346 924e95f9 Michael Hanselmann
        "disk_template": constants.DT_PLAIN,
347 924e95f9 Michael Hanselmann
        "pnode": node["primary"],
348 924e95f9 Michael Hanselmann
        "memory": memory,
349 924e95f9 Michael Hanselmann
        "disks": disk_sizes,
350 924e95f9 Michael Hanselmann
        }
351 924e95f9 Michael Hanselmann
352 924e95f9 Michael Hanselmann
      (job_id, ) = _DoTests([
353 924e95f9 Michael Hanselmann
        ("/2/instances", _VerifyReturnsJob, "POST", body),
354 924e95f9 Michael Hanselmann
        ])
355 8cb70e56 Michael Hanselmann
356 8cb70e56 Michael Hanselmann
    _WaitForRapiJob(job_id)
357 8cb70e56 Michael Hanselmann
358 8cb70e56 Michael Hanselmann
    return instance
359 8cb70e56 Michael Hanselmann
  except:
360 8cb70e56 Michael Hanselmann
    qa_config.ReleaseInstance(instance)
361 8cb70e56 Michael Hanselmann
    raise
362 8cb70e56 Michael Hanselmann
363 8cb70e56 Michael Hanselmann
364 924e95f9 Michael Hanselmann
def TestRapiInstanceRemove(instance, use_client):
365 8cb70e56 Michael Hanselmann
  """Test removing instance via RAPI"""
366 924e95f9 Michael Hanselmann
  if use_client:
367 924e95f9 Michael Hanselmann
    job_id = _rapi_client.DeleteInstance(instance["name"])
368 924e95f9 Michael Hanselmann
  else:
369 924e95f9 Michael Hanselmann
    (job_id, ) = _DoTests([
370 924e95f9 Michael Hanselmann
      ("/2/instances/%s" % instance["name"], _VerifyReturnsJob, "DELETE", None),
371 924e95f9 Michael Hanselmann
      ])
372 8cb70e56 Michael Hanselmann
373 8cb70e56 Michael Hanselmann
  _WaitForRapiJob(job_id)
374 8cb70e56 Michael Hanselmann
375 8cb70e56 Michael Hanselmann
  qa_config.ReleaseInstance(instance)
376 5d831182 Michael Hanselmann
377 5d831182 Michael Hanselmann
378 938bde86 Michael Hanselmann
def TestRapiInstanceMigrate(instance):
379 938bde86 Michael Hanselmann
  """Test migrating instance via RAPI"""
380 938bde86 Michael Hanselmann
  # Move to secondary node
381 938bde86 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.MigrateInstance(instance["name"]))
382 938bde86 Michael Hanselmann
  # And back to previous primary
383 938bde86 Michael Hanselmann
  _WaitForRapiJob(_rapi_client.MigrateInstance(instance["name"]))
384 938bde86 Michael Hanselmann
385 938bde86 Michael Hanselmann
386 7fb50870 Michael Hanselmann
def TestRapiInstanceRename(instance, rename_target):
387 7fb50870 Michael Hanselmann
  """Test renaming instance via RAPI"""
388 7fb50870 Michael Hanselmann
  rename_source = instance["name"]
389 7fb50870 Michael Hanselmann
390 7fb50870 Michael Hanselmann
  for name1, name2 in [(rename_source, rename_target),
391 7fb50870 Michael Hanselmann
                       (rename_target, rename_source)]:
392 7fb50870 Michael Hanselmann
    _WaitForRapiJob(_rapi_client.RenameInstance(name1, name2))
393 7fb50870 Michael Hanselmann
394 7fb50870 Michael Hanselmann
395 3b7158ef Michael Hanselmann
def TestRapiInstanceModify(instance):
396 3b7158ef Michael Hanselmann
  """Test modifying instance via RAPI"""
397 3b7158ef Michael Hanselmann
  def _ModifyInstance(**kwargs):
398 3b7158ef Michael Hanselmann
    _WaitForRapiJob(_rapi_client.ModifyInstance(instance["name"], **kwargs))
399 3b7158ef Michael Hanselmann
400 3b7158ef Michael Hanselmann
  _ModifyInstance(hvparams={
401 3b7158ef Michael Hanselmann
    constants.HV_KERNEL_ARGS: "single",
402 3b7158ef Michael Hanselmann
    })
403 3b7158ef Michael Hanselmann
404 3b7158ef Michael Hanselmann
  _ModifyInstance(beparams={
405 3b7158ef Michael Hanselmann
    constants.BE_VCPUS: 3,
406 3b7158ef Michael Hanselmann
    })
407 3b7158ef Michael Hanselmann
408 3b7158ef Michael Hanselmann
  _ModifyInstance(beparams={
409 3b7158ef Michael Hanselmann
    constants.BE_VCPUS: constants.VALUE_DEFAULT,
410 3b7158ef Michael Hanselmann
    })
411 3b7158ef Michael Hanselmann
412 3b7158ef Michael Hanselmann
  _ModifyInstance(hvparams={
413 3b7158ef Michael Hanselmann
    constants.HV_KERNEL_ARGS: constants.VALUE_DEFAULT,
414 3b7158ef Michael Hanselmann
    })
415 3b7158ef Michael Hanselmann
416 3b7158ef Michael Hanselmann
417 638a7266 Iustin Pop
def TestInterClusterInstanceMove(src_instance, dest_instance,
418 638a7266 Iustin Pop
                                 pnode, snode, tnode):
419 5d831182 Michael Hanselmann
  """Test tools/move-instance"""
420 5d831182 Michael Hanselmann
  master = qa_config.GetMasterNode()
421 5d831182 Michael Hanselmann
422 5d831182 Michael Hanselmann
  rapi_pw_file = tempfile.NamedTemporaryFile()
423 5d831182 Michael Hanselmann
  rapi_pw_file.write(_rapi_password)
424 5d831182 Michael Hanselmann
  rapi_pw_file.flush()
425 5d831182 Michael Hanselmann
426 5d831182 Michael Hanselmann
  # TODO: Run some instance tests before moving back
427 677e16eb Iustin Pop
428 638a7266 Iustin Pop
  if snode is None:
429 638a7266 Iustin Pop
    # instance is not redundant, but we still need to pass a node
430 638a7266 Iustin Pop
    # (which will be ignored)
431 638a7266 Iustin Pop
    fsec = tnode
432 638a7266 Iustin Pop
  else:
433 638a7266 Iustin Pop
    fsec = snode
434 638a7266 Iustin Pop
  # note: pnode:snode are the *current* nodes, so we move it first to
435 638a7266 Iustin Pop
  # tnode:pnode, then back to pnode:snode
436 677e16eb Iustin Pop
  for si, di, pn, sn in [(src_instance["name"], dest_instance["name"],
437 638a7266 Iustin Pop
                          tnode["primary"], pnode["primary"]),
438 677e16eb Iustin Pop
                         (dest_instance["name"], src_instance["name"],
439 638a7266 Iustin Pop
                          pnode["primary"], fsec["primary"])]:
440 5d831182 Michael Hanselmann
    cmd = [
441 5d831182 Michael Hanselmann
      "../tools/move-instance",
442 5d831182 Michael Hanselmann
      "--verbose",
443 5d831182 Michael Hanselmann
      "--src-ca-file=%s" % _rapi_ca.name,
444 5d831182 Michael Hanselmann
      "--src-username=%s" % _rapi_username,
445 5d831182 Michael Hanselmann
      "--src-password-file=%s" % rapi_pw_file.name,
446 677e16eb Iustin Pop
      "--dest-instance-name=%s" % di,
447 677e16eb Iustin Pop
      "--dest-primary-node=%s" % pn,
448 677e16eb Iustin Pop
      "--dest-secondary-node=%s" % sn,
449 a889c536 Michael Hanselmann
      "--net=0:mac=%s" % constants.VALUE_GENERATE,
450 5d831182 Michael Hanselmann
      master["primary"],
451 5d831182 Michael Hanselmann
      master["primary"],
452 677e16eb Iustin Pop
      si,
453 5d831182 Michael Hanselmann
      ]
454 5d831182 Michael Hanselmann
455 5d831182 Michael Hanselmann
    AssertEqual(StartLocalCommand(cmd).wait(), 0)