Statistics
| Branch: | Tag: | Revision:

root / qa / qa_rapi.py @ a47f574c

History | View | Annotate | Download (5.2 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 a47f574c Oleksiy Mishchenko
                   "admin_state", "admin_ram",
45 a47f574c Oleksiy Mishchenko
                   "disk_template", "ip", "mac", "bridge",
46 a47f574c Oleksiy Mishchenko
                   "sda_size", "sdb_size", "vcpus",
47 a47f574c Oleksiy Mishchenko
                   "oper_state", "status", "tags")
48 a47f574c Oleksiy Mishchenko
49 a47f574c Oleksiy Mishchenko
NODE_FIELDS = ("name", "dtotal", "dfree",
50 a47f574c Oleksiy Mishchenko
               "mtotal", "mnode", "mfree",
51 a47f574c Oleksiy Mishchenko
               "pinst_cnt", "sinst_cnt", "tags")
52 a47f574c Oleksiy Mishchenko
53 a47f574c Oleksiy Mishchenko
LIST_FIELDS = ("name", "uri")
54 a47f574c Oleksiy Mishchenko
55 a47f574c Oleksiy Mishchenko
56 a47f574c Oleksiy Mishchenko
def Enabled():
57 a47f574c Oleksiy Mishchenko
  """Return whether remote API tests should be run.
58 a47f574c Oleksiy Mishchenko

59 a47f574c Oleksiy Mishchenko
  """
60 a47f574c Oleksiy Mishchenko
  return constants.RAPI_ENABLE and qa_config.TestEnabled('rapi')
61 a47f574c Oleksiy Mishchenko
62 a47f574c Oleksiy Mishchenko
63 a47f574c Oleksiy Mishchenko
def PrintRemoteAPIWarning():
64 a47f574c Oleksiy Mishchenko
  """Print warning if remote API is not enabled.
65 a47f574c Oleksiy Mishchenko

66 a47f574c Oleksiy Mishchenko
  """
67 a47f574c Oleksiy Mishchenko
  if constants.RAPI_ENABLE or not qa_config.TestEnabled('rapi'):
68 a47f574c Oleksiy Mishchenko
    return
69 a47f574c Oleksiy Mishchenko
  msg = ("Remote API is not enabled in this Ganeti build. Please run"
70 a47f574c Oleksiy Mishchenko
         " `configure [...] --enable-rapi'.")
71 a47f574c Oleksiy Mishchenko
  print
72 a47f574c Oleksiy Mishchenko
  print qa_utils.FormatWarning(msg)
73 a47f574c Oleksiy Mishchenko
74 a47f574c Oleksiy Mishchenko
75 a47f574c Oleksiy Mishchenko
def _DoTests(uris):
76 a47f574c Oleksiy Mishchenko
  master = qa_config.GetMasterNode()
77 a47f574c Oleksiy Mishchenko
  host = master["primary"]
78 a47f574c Oleksiy Mishchenko
  port = qa_config.get("rapi-port", default=constants.RAPI_PORT)
79 a47f574c Oleksiy Mishchenko
80 a47f574c Oleksiy Mishchenko
  for uri, verify in uris:
81 a47f574c Oleksiy Mishchenko
    assert uri.startswith("/")
82 a47f574c Oleksiy Mishchenko
83 a47f574c Oleksiy Mishchenko
    url = "http://%s:%s%s" % (host, port, uri)
84 a47f574c Oleksiy Mishchenko
85 a47f574c Oleksiy Mishchenko
    print "Testing %s ..." % url
86 a47f574c Oleksiy Mishchenko
87 a47f574c Oleksiy Mishchenko
    response = NoProxyOpener.open(url)
88 a47f574c Oleksiy Mishchenko
89 a47f574c Oleksiy Mishchenko
    AssertEqual(response.info()["Content-type"], "application/json")
90 a47f574c Oleksiy Mishchenko
91 a47f574c Oleksiy Mishchenko
    data = serializer.LoadJson(response.read())
92 a47f574c Oleksiy Mishchenko
93 a47f574c Oleksiy Mishchenko
    if verify is not None:
94 a47f574c Oleksiy Mishchenko
      if callable(verify):
95 a47f574c Oleksiy Mishchenko
        verify(data)
96 a47f574c Oleksiy Mishchenko
      else:
97 a47f574c Oleksiy Mishchenko
        AssertEqual(data, verify)
98 a47f574c Oleksiy Mishchenko
99 a47f574c Oleksiy Mishchenko
100 a47f574c Oleksiy Mishchenko
@qa_utils.DefineHook('rapi-version')
101 a47f574c Oleksiy Mishchenko
def TestVersion():
102 a47f574c Oleksiy Mishchenko
  """Testing remote API version.
103 a47f574c Oleksiy Mishchenko

104 a47f574c Oleksiy Mishchenko
  """
105 a47f574c Oleksiy Mishchenko
  _DoTests([
106 a47f574c Oleksiy Mishchenko
    ("/version", constants.RAPI_VERSION),
107 a47f574c Oleksiy Mishchenko
    ])
108 a47f574c Oleksiy Mishchenko
109 a47f574c Oleksiy Mishchenko
110 a47f574c Oleksiy Mishchenko
@qa_utils.DefineHook('rapi-empty-cluster')
111 a47f574c Oleksiy Mishchenko
def TestEmptyCluster():
112 a47f574c Oleksiy Mishchenko
  """Testing remote API on an empty cluster.
113 a47f574c Oleksiy Mishchenko

114 a47f574c Oleksiy Mishchenko
  """
115 a47f574c Oleksiy Mishchenko
  master_name = qa_config.GetMasterNode()["primary"]
116 a47f574c Oleksiy Mishchenko
117 a47f574c Oleksiy Mishchenko
  def _VerifyInfo(data):
118 a47f574c Oleksiy Mishchenko
    AssertIn("name", data)
119 a47f574c Oleksiy Mishchenko
    AssertIn("master", data)
120 a47f574c Oleksiy Mishchenko
    AssertEqual(data["master"], master_name)
121 a47f574c Oleksiy Mishchenko
122 a47f574c Oleksiy Mishchenko
  def _VerifyNodes(data):
123 a47f574c Oleksiy Mishchenko
    master_entry = {
124 a47f574c Oleksiy Mishchenko
      "name": master_name,
125 a47f574c Oleksiy Mishchenko
      "uri": "/nodes/%s" % master_name,
126 a47f574c Oleksiy Mishchenko
      }
127 a47f574c Oleksiy Mishchenko
    AssertIn(master_entry, data)
128 a47f574c Oleksiy Mishchenko
129 a47f574c Oleksiy Mishchenko
  def _VerifyNodesBulk(data):
130 a47f574c Oleksiy Mishchenko
    for node in data:
131 a47f574c Oleksiy Mishchenko
      for entry in NODE_FIELDS:
132 a47f574c Oleksiy Mishchenko
        AssertIn(entry, node)
133 a47f574c Oleksiy Mishchenko
134 a47f574c Oleksiy Mishchenko
  _DoTests([
135 a47f574c Oleksiy Mishchenko
    ("/", None),
136 a47f574c Oleksiy Mishchenko
    ("/info", _VerifyInfo),
137 a47f574c Oleksiy Mishchenko
    ("/tags", None),
138 a47f574c Oleksiy Mishchenko
    ("/nodes", _VerifyNodes),
139 a47f574c Oleksiy Mishchenko
    ("/nodes?bulk=1", _VerifyNodesBulk),
140 a47f574c Oleksiy Mishchenko
    ("/instances", []),
141 a47f574c Oleksiy Mishchenko
    ("/instances?bulk=1", []),
142 a47f574c Oleksiy Mishchenko
    ("/os", None),
143 a47f574c Oleksiy Mishchenko
    ])
144 a47f574c Oleksiy Mishchenko
145 a47f574c Oleksiy Mishchenko
146 a47f574c Oleksiy Mishchenko
@qa_utils.DefineHook('rapi-instance')
147 a47f574c Oleksiy Mishchenko
def TestInstance(instance):
148 a47f574c Oleksiy Mishchenko
  """Testing getting instance(s) info via remote API.
149 a47f574c Oleksiy Mishchenko

150 a47f574c Oleksiy Mishchenko
  """
151 a47f574c Oleksiy Mishchenko
  def _VerifyInstance(data):
152 a47f574c Oleksiy Mishchenko
    for entry in INSTANCE_FIELDS:
153 a47f574c Oleksiy Mishchenko
      AssertIn(entry, data)
154 a47f574c Oleksiy Mishchenko
  
155 a47f574c Oleksiy Mishchenko
  def _VerifyInstancesList(data):
156 a47f574c Oleksiy Mishchenko
    for instance in data:
157 a47f574c Oleksiy Mishchenko
      for entry in LIST_FIELDS: 
158 a47f574c Oleksiy Mishchenko
        AssertIn(entry, instance)
159 a47f574c Oleksiy Mishchenko
      
160 a47f574c Oleksiy Mishchenko
  def _VerifyInstancesBulk(data):
161 a47f574c Oleksiy Mishchenko
    for instance_data in data:
162 a47f574c Oleksiy Mishchenko
      _VerifyInstance(instance_data)
163 a47f574c Oleksiy Mishchenko
164 a47f574c Oleksiy Mishchenko
  _DoTests([
165 a47f574c Oleksiy Mishchenko
    ("/instances/%s" % instance["name"], _VerifyInstance),
166 a47f574c Oleksiy Mishchenko
    ("/instances", _VerifyInstancesList),
167 a47f574c Oleksiy Mishchenko
    ("/instances?bulk=1", _VerifyInstancesBulk),
168 a47f574c Oleksiy Mishchenko
    ])
169 a47f574c Oleksiy Mishchenko
170 a47f574c Oleksiy Mishchenko
171 a47f574c Oleksiy Mishchenko
@qa_utils.DefineHook('rapi-node')
172 a47f574c Oleksiy Mishchenko
def TestNode(node):
173 a47f574c Oleksiy Mishchenko
  """Testing getting node(s) info via remote API.
174 a47f574c Oleksiy Mishchenko

175 a47f574c Oleksiy Mishchenko
  """
176 a47f574c Oleksiy Mishchenko
  def _VerifyNode(data):
177 a47f574c Oleksiy Mishchenko
    for entry in NODE_FIELDS:
178 a47f574c Oleksiy Mishchenko
      AssertIn(entry, data)
179 a47f574c Oleksiy Mishchenko
  
180 a47f574c Oleksiy Mishchenko
  def _VerifyNodesList(data):
181 a47f574c Oleksiy Mishchenko
    for node in data:
182 a47f574c Oleksiy Mishchenko
      for entry in LIST_FIELDS: 
183 a47f574c Oleksiy Mishchenko
        AssertIn(entry, node)
184 a47f574c Oleksiy Mishchenko
  
185 a47f574c Oleksiy Mishchenko
  def _VerifyNodesBulk(data):
186 a47f574c Oleksiy Mishchenko
    for node_data in data:
187 a47f574c Oleksiy Mishchenko
      _VerifyNode(node_data)
188 a47f574c Oleksiy Mishchenko
189 a47f574c Oleksiy Mishchenko
  _DoTests([
190 a47f574c Oleksiy Mishchenko
    ("/nodes/%s" % node["primary"], _VerifyNode),
191 a47f574c Oleksiy Mishchenko
    ("/nodes", _VerifyNodesList),
192 a47f574c Oleksiy Mishchenko
    ("/nodes?bulk=1", _VerifyNodesBulk),
193 a47f574c Oleksiy Mishchenko
    ])
194 a47f574c Oleksiy Mishchenko
195 a47f574c Oleksiy Mishchenko
196 a47f574c Oleksiy Mishchenko
def TestTags(kind, name, tags):
197 a47f574c Oleksiy Mishchenko
  """Tests .../tags resources.
198 a47f574c Oleksiy Mishchenko

199 a47f574c Oleksiy Mishchenko
  """
200 a47f574c Oleksiy Mishchenko
  if kind == constants.TAG_CLUSTER:
201 a47f574c Oleksiy Mishchenko
    uri = "/tags"
202 a47f574c Oleksiy Mishchenko
  elif kind == constants.TAG_NODE:
203 a47f574c Oleksiy Mishchenko
    uri = "/nodes/%s/tags" % name
204 a47f574c Oleksiy Mishchenko
  elif kind == constants.TAG_INSTANCE:
205 a47f574c Oleksiy Mishchenko
    uri = "/instances/%s/tags" % name
206 a47f574c Oleksiy Mishchenko
  else:
207 a47f574c Oleksiy Mishchenko
    raise errors.ProgrammerError("Unknown tag kind")
208 a47f574c Oleksiy Mishchenko
209 a47f574c Oleksiy Mishchenko
  def _VerifyTags(data):
210 a47f574c Oleksiy Mishchenko
    # Create copies to modify
211 a47f574c Oleksiy Mishchenko
    should = tags[:]
212 a47f574c Oleksiy Mishchenko
    should.sort()
213 a47f574c Oleksiy Mishchenko
214 a47f574c Oleksiy Mishchenko
    returned = data[:]
215 a47f574c Oleksiy Mishchenko
    returned.sort()
216 a47f574c Oleksiy Mishchenko
    AssertEqual(should, returned)
217 a47f574c Oleksiy Mishchenko
218 a47f574c Oleksiy Mishchenko
  _DoTests([
219 a47f574c Oleksiy Mishchenko
    (uri, _VerifyTags),
220 a47f574c Oleksiy Mishchenko
    ])