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