diff --git a/lib/rapi/baserlib.py b/lib/rapi/baserlib.py index 1409476120f48389623beaf975e3b4bdba8e5c10..9d0935d82d56796c8bc6dbdfbadadbebf3a6b2d4 100644 --- a/lib/rapi/baserlib.py +++ b/lib/rapi/baserlib.py @@ -28,6 +28,7 @@ import ganeti.opcodes from ganeti import luxi from ganeti import rapi +from ganeti import http def BuildUriList(ids, uri_format, uri_fields=("name", "uri")): @@ -173,3 +174,32 @@ class R_Generic(object): """ return self.sn + + def _checkIntVariable(self, name): + """Return the parsed value of an int argument. + + """ + val = self.queryargs.get(name, 0) + if isinstance(val, list): + if val: + val = val[0] + else: + val = 0 + try: + val = int(val) + except (ValueError, TypeError), err: + raise http.HttpBadRequest(message="Invalid value for the" + " '%s' parameter" % (name,)) + return val + + def useLocking(self): + """Check if the request specifies locking. + + """ + return self._checkIntVariable('lock') + + def useBulk(self): + """Check if the request specifies bulk querying. + + """ + return self._checkIntVariable('bulk') diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py index 348113214d1cbf2b5cee9fdc0aa7b25f1b1d0f30..35aee518db3e5b5e989a83f8cd65185c0f2c89aa 100644 --- a/lib/rapi/rlib2.py +++ b/lib/rapi/rlib2.py @@ -217,7 +217,7 @@ class R_2_nodes(baserlib.R_Generic): """ client = luxi.Client() - if 'bulk' in self.queryargs: + if self.useBulk(): bulkdata = client.QueryNodes([], N_FIELDS, False) return baserlib.MapBulkFields(bulkdata, N_FIELDS) else: @@ -240,7 +240,7 @@ class R_2_nodes_name(baserlib.R_Generic): node_name = self.items[0] client = luxi.Client() result = client.QueryNodes(names=[node_name], fields=N_FIELDS, - use_locking=False) + use_locking=self.useLocking()) return baserlib.MapFields(N_FIELDS, result[0]) @@ -301,12 +301,12 @@ class R_2_instances(baserlib.R_Generic): """ client = luxi.Client() - - if 'bulk' in self.queryargs: - bulkdata = client.QueryInstances([], I_FIELDS, False) + use_locking = self.useLocking() + if self.useBulk(): + bulkdata = client.QueryInstances([], I_FIELDS, use_locking) return baserlib.MapBulkFields(bulkdata, I_FIELDS) else: - instancesdata = client.QueryInstances([], ["name"], False) + instancesdata = client.QueryInstances([], ["name"], use_locking) instanceslist = [row[0] for row in instancesdata] return baserlib.BuildUriList(instanceslist, "/2/instances/%s", uri_fields=("id", "uri")) @@ -362,7 +362,7 @@ class R_2_instances_name(baserlib.R_Generic): client = luxi.Client() instance_name = self.items[0] result = client.QueryInstances(names=[instance_name], fields=I_FIELDS, - use_locking=False) + use_locking=self.useLocking()) return baserlib.MapFields(I_FIELDS, result[0])