diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py index 2dffc52799c65c396f4cc8260e0a35aa99fa7306..a1e200a8c2873704659a2054faea505df0fe7888 100644 --- a/lib/rapi/rlib2.py +++ b/lib/rapi/rlib2.py @@ -83,6 +83,9 @@ _NR_MAP = { "R": _NR_REGULAR, } +# Request data version field +_REQ_DATA_VERSION = "__version__" + # Timeout for /2/jobs/[job_id]/wait. Gives job up to 10 seconds to change. _WFJC_TIMEOUT = 10 @@ -491,15 +494,13 @@ class R_2_instances(baserlib.R_Generic): return baserlib.BuildUriList(instanceslist, "/2/instances/%s", uri_fields=("id", "uri")) - def POST(self): - """Create an instance. + def _ParseVersion0CreateRequest(self): + """Parses an instance creation request version 0. - @return: a job id + @rtype: L{opcodes.OpCreateInstance} + @return: Instance creation opcode """ - if not isinstance(self.req.request_body, dict): - raise http.HttpBadRequest("Invalid body contents, not a dictionary") - beparams = baserlib.MakeParamsDict(self.req.request_body, constants.BES_PARAMETERS) hvparams = baserlib.MakeParamsDict(self.req.request_body, @@ -516,6 +517,7 @@ class R_2_instances(baserlib.R_Generic): raise http.HttpBadRequest("Disk %d specification wrong: should" " be an integer" % idx) disks.append({"size": d}) + # nic processing (one nic only) nics = [{"mac": fn("mac", constants.VALUE_AUTO)}] if fn("ip", None) is not None: @@ -527,7 +529,7 @@ class R_2_instances(baserlib.R_Generic): if fn("bridge", None) is not None: nics[0]["bridge"] = fn("bridge") - op = opcodes.OpCreateInstance( + return opcodes.OpCreateInstance( mode=constants.INSTANCE_CREATE, instance_name=fn('name'), disks=disks, @@ -549,6 +551,24 @@ class R_2_instances(baserlib.R_Generic): dry_run=bool(self.dryRun()), ) + def POST(self): + """Create an instance. + + @return: a job id + + """ + if not isinstance(self.req.request_body, dict): + raise http.HttpBadRequest("Invalid body contents, not a dictionary") + + # Default to request data version 0 + data_version = self.getBodyParameter(_REQ_DATA_VERSION, 0) + + if data_version == 0: + op = self._ParseVersion0CreateRequest() + else: + raise http.HttpBadRequest("Unsupported request data version %s" % + request_version) + return baserlib.SubmitJob([op])