Statistics
| Branch: | Tag: | Revision:

root / qa / qa_rapi.py @ 2d6db53a

History | View | Annotate | Download (4.8 kB)

1 a47f574c Oleksiy Mishchenko
#
2 a47f574c Oleksiy Mishchenko
3 a47f574c Oleksiy Mishchenko
# Copyright (C) 2007, 2008 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 a47f574c Oleksiy Mishchenko
import urllib2
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 a47f574c Oleksiy Mishchenko
32 a47f574c Oleksiy Mishchenko
import qa_config
33 a47f574c Oleksiy Mishchenko
import qa_utils
34 a47f574c Oleksiy Mishchenko
import qa_error
35 a47f574c Oleksiy Mishchenko
36 a47f574c Oleksiy Mishchenko
from qa_utils import AssertEqual, AssertNotEqual, AssertIn, StartSSH
37 a47f574c Oleksiy Mishchenko
38 a47f574c Oleksiy Mishchenko
39 a47f574c Oleksiy Mishchenko
# Create opener which doesn't try to look for proxies.
40 a47f574c Oleksiy Mishchenko
NoProxyOpener = urllib2.build_opener(urllib2.ProxyHandler({}))
41 a47f574c Oleksiy Mishchenko
42 a47f574c Oleksiy Mishchenko
43 a47f574c Oleksiy Mishchenko
INSTANCE_FIELDS = ("name", "os", "pnode", "snodes",
44 a5b9d725 Iustin Pop
                   "admin_state",
45 a5b9d725 Iustin Pop
                   "disk_template", "disk.sizes",
46 a5b9d725 Iustin Pop
                   "nic.ips", "nic.macs", "nic.bridges",
47 a5b9d725 Iustin Pop
                   "beparams", "hvparams",
48 a5b9d725 Iustin Pop
                   "oper_state", "oper_ram", "status", "tags")
49 a47f574c Oleksiy Mishchenko
50 a47f574c Oleksiy Mishchenko
NODE_FIELDS = ("name", "dtotal", "dfree",
51 a47f574c Oleksiy Mishchenko
               "mtotal", "mnode", "mfree",
52 a47f574c Oleksiy Mishchenko
               "pinst_cnt", "sinst_cnt", "tags")
53 a47f574c Oleksiy Mishchenko
54 68289c75 Iustin Pop
LIST_FIELDS = ("id", "uri")
55 a47f574c Oleksiy Mishchenko
56 a47f574c Oleksiy Mishchenko
57 a47f574c Oleksiy Mishchenko
def Enabled():
58 a47f574c Oleksiy Mishchenko
  """Return whether remote API tests should be run.
59 a47f574c Oleksiy Mishchenko

60 a47f574c Oleksiy Mishchenko
  """
61 e1876432 Guido Trotter
  return qa_config.TestEnabled('rapi')
62 a47f574c Oleksiy Mishchenko
63 a47f574c Oleksiy Mishchenko
64 a47f574c Oleksiy Mishchenko
def _DoTests(uris):
65 a47f574c Oleksiy Mishchenko
  master = qa_config.GetMasterNode()
66 a47f574c Oleksiy Mishchenko
  host = master["primary"]
67 8c96d01f Guido Trotter
  port = qa_config.get("rapi-port", default=constants.DEFAULT_RAPI_PORT)
68 a47f574c Oleksiy Mishchenko
69 a47f574c Oleksiy Mishchenko
  for uri, verify in uris:
70 a47f574c Oleksiy Mishchenko
    assert uri.startswith("/")
71 a47f574c Oleksiy Mishchenko
72 49b1d36e Iustin Pop
    url = "https://%s:%s%s" % (host, port, uri)
73 a47f574c Oleksiy Mishchenko
74 a47f574c Oleksiy Mishchenko
    print "Testing %s ..." % url
75 a47f574c Oleksiy Mishchenko
76 a47f574c Oleksiy Mishchenko
    response = NoProxyOpener.open(url)
77 a47f574c Oleksiy Mishchenko
78 a47f574c Oleksiy Mishchenko
    AssertEqual(response.info()["Content-type"], "application/json")
79 a47f574c Oleksiy Mishchenko
80 a47f574c Oleksiy Mishchenko
    data = serializer.LoadJson(response.read())
81 a47f574c Oleksiy Mishchenko
82 a47f574c Oleksiy Mishchenko
    if verify is not None:
83 a47f574c Oleksiy Mishchenko
      if callable(verify):
84 a47f574c Oleksiy Mishchenko
        verify(data)
85 a47f574c Oleksiy Mishchenko
      else:
86 a47f574c Oleksiy Mishchenko
        AssertEqual(data, verify)
87 a47f574c Oleksiy Mishchenko
88 a47f574c Oleksiy Mishchenko
89 a47f574c Oleksiy Mishchenko
def TestVersion():
90 a47f574c Oleksiy Mishchenko
  """Testing remote API version.
91 a47f574c Oleksiy Mishchenko

92 a47f574c Oleksiy Mishchenko
  """
93 a47f574c Oleksiy Mishchenko
  _DoTests([
94 a47f574c Oleksiy Mishchenko
    ("/version", constants.RAPI_VERSION),
95 a47f574c Oleksiy Mishchenko
    ])
96 a47f574c Oleksiy Mishchenko
97 a47f574c Oleksiy Mishchenko
98 a47f574c Oleksiy Mishchenko
def TestEmptyCluster():
99 a47f574c Oleksiy Mishchenko
  """Testing remote API on an empty cluster.
100 a47f574c Oleksiy Mishchenko

101 a47f574c Oleksiy Mishchenko
  """
102 a47f574c Oleksiy Mishchenko
  master_name = qa_config.GetMasterNode()["primary"]
103 a47f574c Oleksiy Mishchenko
104 a47f574c Oleksiy Mishchenko
  def _VerifyInfo(data):
105 a47f574c Oleksiy Mishchenko
    AssertIn("name", data)
106 a47f574c Oleksiy Mishchenko
    AssertIn("master", data)
107 a47f574c Oleksiy Mishchenko
    AssertEqual(data["master"], master_name)
108 a47f574c Oleksiy Mishchenko
109 a47f574c Oleksiy Mishchenko
  def _VerifyNodes(data):
110 a47f574c Oleksiy Mishchenko
    master_entry = {
111 a5b9d725 Iustin Pop
      "id": master_name,
112 a5b9d725 Iustin Pop
      "uri": "/2/nodes/%s" % master_name,
113 a47f574c Oleksiy Mishchenko
      }
114 a47f574c Oleksiy Mishchenko
    AssertIn(master_entry, data)
115 a47f574c Oleksiy Mishchenko
116 a47f574c Oleksiy Mishchenko
  def _VerifyNodesBulk(data):
117 a47f574c Oleksiy Mishchenko
    for node in data:
118 a47f574c Oleksiy Mishchenko
      for entry in NODE_FIELDS:
119 a47f574c Oleksiy Mishchenko
        AssertIn(entry, node)
120 a47f574c Oleksiy Mishchenko
121 a47f574c Oleksiy Mishchenko
  _DoTests([
122 a47f574c Oleksiy Mishchenko
    ("/", None),
123 a5b9d725 Iustin Pop
    ("/2/info", _VerifyInfo),
124 a5b9d725 Iustin Pop
    ("/2/tags", None),
125 a5b9d725 Iustin Pop
    ("/2/nodes", _VerifyNodes),
126 a5b9d725 Iustin Pop
    ("/2/nodes?bulk=1", _VerifyNodesBulk),
127 a5b9d725 Iustin Pop
    ("/2/instances", []),
128 a5b9d725 Iustin Pop
    ("/2/instances?bulk=1", []),
129 a5b9d725 Iustin Pop
    ("/2/os", None),
130 a47f574c Oleksiy Mishchenko
    ])
131 a47f574c Oleksiy Mishchenko
132 a47f574c Oleksiy Mishchenko
133 a47f574c Oleksiy Mishchenko
def TestInstance(instance):
134 a47f574c Oleksiy Mishchenko
  """Testing getting instance(s) info via remote API.
135 a47f574c Oleksiy Mishchenko

136 a47f574c Oleksiy Mishchenko
  """
137 a47f574c Oleksiy Mishchenko
  def _VerifyInstance(data):
138 a47f574c Oleksiy Mishchenko
    for entry in INSTANCE_FIELDS:
139 a47f574c Oleksiy Mishchenko
      AssertIn(entry, data)
140 c85d3b64 Michael Hanselmann
141 a47f574c Oleksiy Mishchenko
  def _VerifyInstancesList(data):
142 a47f574c Oleksiy Mishchenko
    for instance in data:
143 c85d3b64 Michael Hanselmann
      for entry in LIST_FIELDS:
144 a47f574c Oleksiy Mishchenko
        AssertIn(entry, instance)
145 c85d3b64 Michael Hanselmann
146 a47f574c Oleksiy Mishchenko
  def _VerifyInstancesBulk(data):
147 a47f574c Oleksiy Mishchenko
    for instance_data in data:
148 a47f574c Oleksiy Mishchenko
      _VerifyInstance(instance_data)
149 a47f574c Oleksiy Mishchenko
150 a47f574c Oleksiy Mishchenko
  _DoTests([
151 a5b9d725 Iustin Pop
    ("/2/instances/%s" % instance["name"], _VerifyInstance),
152 a5b9d725 Iustin Pop
    ("/2/instances", _VerifyInstancesList),
153 a5b9d725 Iustin Pop
    ("/2/instances?bulk=1", _VerifyInstancesBulk),
154 a47f574c Oleksiy Mishchenko
    ])
155 a47f574c Oleksiy Mishchenko
156 a47f574c Oleksiy Mishchenko
157 a47f574c Oleksiy Mishchenko
def TestNode(node):
158 a47f574c Oleksiy Mishchenko
  """Testing getting node(s) info via remote API.
159 a47f574c Oleksiy Mishchenko

160 a47f574c Oleksiy Mishchenko
  """
161 a47f574c Oleksiy Mishchenko
  def _VerifyNode(data):
162 a47f574c Oleksiy Mishchenko
    for entry in NODE_FIELDS:
163 a47f574c Oleksiy Mishchenko
      AssertIn(entry, data)
164 c85d3b64 Michael Hanselmann
165 a47f574c Oleksiy Mishchenko
  def _VerifyNodesList(data):
166 a47f574c Oleksiy Mishchenko
    for node in data:
167 c85d3b64 Michael Hanselmann
      for entry in LIST_FIELDS:
168 a47f574c Oleksiy Mishchenko
        AssertIn(entry, node)
169 c85d3b64 Michael Hanselmann
170 a47f574c Oleksiy Mishchenko
  def _VerifyNodesBulk(data):
171 a47f574c Oleksiy Mishchenko
    for node_data in data:
172 a47f574c Oleksiy Mishchenko
      _VerifyNode(node_data)
173 a47f574c Oleksiy Mishchenko
174 a47f574c Oleksiy Mishchenko
  _DoTests([
175 a5b9d725 Iustin Pop
    ("/2/nodes/%s" % node["primary"], _VerifyNode),
176 a5b9d725 Iustin Pop
    ("/2/nodes", _VerifyNodesList),
177 a5b9d725 Iustin Pop
    ("/2/nodes?bulk=1", _VerifyNodesBulk),
178 a47f574c Oleksiy Mishchenko
    ])
179 a47f574c Oleksiy Mishchenko
180 a47f574c Oleksiy Mishchenko
181 a47f574c Oleksiy Mishchenko
def TestTags(kind, name, tags):
182 a47f574c Oleksiy Mishchenko
  """Tests .../tags resources.
183 a47f574c Oleksiy Mishchenko

184 a47f574c Oleksiy Mishchenko
  """
185 a47f574c Oleksiy Mishchenko
  if kind == constants.TAG_CLUSTER:
186 a5b9d725 Iustin Pop
    uri = "/2/tags"
187 a47f574c Oleksiy Mishchenko
  elif kind == constants.TAG_NODE:
188 a5b9d725 Iustin Pop
    uri = "/2/nodes/%s/tags" % name
189 a47f574c Oleksiy Mishchenko
  elif kind == constants.TAG_INSTANCE:
190 a5b9d725 Iustin Pop
    uri = "/2/instances/%s/tags" % name
191 a47f574c Oleksiy Mishchenko
  else:
192 a47f574c Oleksiy Mishchenko
    raise errors.ProgrammerError("Unknown tag kind")
193 a47f574c Oleksiy Mishchenko
194 a47f574c Oleksiy Mishchenko
  def _VerifyTags(data):
195 a47f574c Oleksiy Mishchenko
    # Create copies to modify
196 a47f574c Oleksiy Mishchenko
    should = tags[:]
197 a47f574c Oleksiy Mishchenko
    should.sort()
198 a47f574c Oleksiy Mishchenko
199 a47f574c Oleksiy Mishchenko
    returned = data[:]
200 a47f574c Oleksiy Mishchenko
    returned.sort()
201 a47f574c Oleksiy Mishchenko
    AssertEqual(should, returned)
202 a47f574c Oleksiy Mishchenko
203 a47f574c Oleksiy Mishchenko
  _DoTests([
204 a47f574c Oleksiy Mishchenko
    (uri, _VerifyTags),
205 a47f574c Oleksiy Mishchenko
    ])