Revision 10f5ab6c
b/lib/rapi/client.py | ||
---|---|---|
351 | 351 |
"User-Agent": self.USER_AGENT, |
352 | 352 |
} |
353 | 353 |
|
354 |
@staticmethod |
|
355 |
def _EncodeQuery(query): |
|
356 |
"""Encode query values for RAPI URL. |
|
357 |
|
|
358 |
@type query: list of two-tuples |
|
359 |
@param query: Query arguments |
|
360 |
@rtype: list |
|
361 |
@return: Query list with encoded values |
|
362 |
|
|
363 |
""" |
|
364 |
result = [] |
|
365 |
|
|
366 |
for name, value in query: |
|
367 |
if value is None: |
|
368 |
result.append((name, "")) |
|
369 |
|
|
370 |
elif isinstance(value, bool): |
|
371 |
# Boolean values must be encoded as 0 or 1 |
|
372 |
result.append((name, int(value))) |
|
373 |
|
|
374 |
elif isinstance(value, (list, tuple, dict)): |
|
375 |
raise ValueError("Invalid query data type %r" % type(value).__name__) |
|
376 |
|
|
377 |
else: |
|
378 |
result.append((name, value)) |
|
379 |
|
|
380 |
return result |
|
381 |
|
|
354 | 382 |
def _SendRequest(self, method, path, query, content): |
355 | 383 |
"""Sends an HTTP request. |
356 | 384 |
|
... | ... | |
384 | 412 |
url = [self._base_url, path] |
385 | 413 |
if query: |
386 | 414 |
url.append("?") |
387 |
url.append(urllib.urlencode(query))
|
|
415 |
url.append(urllib.urlencode(self._EncodeQuery(query)))
|
|
388 | 416 |
|
389 | 417 |
req = _RapiRequest(method, "".join(url), self._headers, encoded_content) |
390 | 418 |
|
b/test/ganeti.rapi.client_unittest.py | ||
---|---|---|
151 | 151 |
def assertDryRun(self): |
152 | 152 |
self.assertTrue(self.rapi.GetLastHandler().dryRun()) |
153 | 153 |
|
154 |
def testEncodeQuery(self): |
|
155 |
query = [ |
|
156 |
("a", None), |
|
157 |
("b", 1), |
|
158 |
("c", 2), |
|
159 |
("d", "Foo"), |
|
160 |
("e", True), |
|
161 |
] |
|
162 |
|
|
163 |
expected = [ |
|
164 |
("a", ""), |
|
165 |
("b", 1), |
|
166 |
("c", 2), |
|
167 |
("d", "Foo"), |
|
168 |
("e", 1), |
|
169 |
] |
|
170 |
|
|
171 |
self.assertEqualValues(self.client._EncodeQuery(query), |
|
172 |
expected) |
|
173 |
|
|
174 |
# invalid types |
|
175 |
for i in [[1, 2, 3], {"moo": "boo"}, (1, 2, 3)]: |
|
176 |
self.assertRaises(ValueError, self.client._EncodeQuery, [("x", i)]) |
|
177 |
|
|
154 | 178 |
def testHttpError(self): |
155 | 179 |
self.rapi.AddResponse(None, code=404) |
156 | 180 |
try: |
... | ... | |
255 | 279 |
self.assertItems(["i-bar"]) |
256 | 280 |
self.assertDryRun() |
257 | 281 |
self.assertQuery("type", ["hard"]) |
258 |
self.assertQuery("ignore_secondaries", ["True"])
|
|
282 |
self.assertQuery("ignore_secondaries", ["1"])
|
|
259 | 283 |
|
260 | 284 |
def testShutdownInstance(self): |
261 | 285 |
self.rapi.AddResponse("1487") |
... | ... | |
403 | 427 |
self.client.SetNodeRole("node-foo", "master-candidate", force=True)) |
404 | 428 |
self.assertHandler(rlib2.R_2_nodes_name_role) |
405 | 429 |
self.assertItems(["node-foo"]) |
406 |
self.assertQuery("force", ["True"])
|
|
430 |
self.assertQuery("force", ["1"])
|
|
407 | 431 |
self.assertEqual("\"master-candidate\"", self.http.last_request.data) |
408 | 432 |
|
409 | 433 |
self.assertRaises(client.InvalidNodeRole, |
Also available in: Unified diff