From: René Nussbaumer Date: Tue, 7 Dec 2010 15:22:29 +0000 (+0100) Subject: Check payload of OOB execution X-Git-Tag: v2.4.0beta1~169 X-Git-Url: https://code.grnet.gr/git/ganeti-local/commitdiff_plain/d0b98288d596d2aeb2c63d388f97184b3aa8bdd7 Check payload of OOB execution Signed-off-by: René Nussbaumer Reviewed-by: Iustin Pop --- diff --git a/lib/cmdlib.py b/lib/cmdlib.py index f5c3fcb..523043d 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -3274,6 +3274,8 @@ class LUOutOfBand(NoHooksLU): result.Raise("An error occurred on execution of OOB helper") + self._CheckPayload(result) + if self.op.command == constants.OOB_HEALTH: # For health we should log important events for item, status in result.payload: @@ -3284,6 +3286,42 @@ class LUOutOfBand(NoHooksLU): return result.payload + def _CheckPayload(self, result): + """Checks if the payload is valid. + + @param result: RPC result + @raises errors.OpExecError: If payload is not valid + + """ + errs = [] + if self.op.command == constants.OOB_HEALTH: + if not isinstance(result.payload, list): + errs.append("command 'health' is expected to return a list but got %s" % + type(result.payload)) + for item, status in result.payload: + if status not in constants.OOB_STATUSES: + errs.append("health item '%s' has invalid status '%s'" % + (item, status)) + + if self.op.command == constants.OOB_POWER_STATUS: + if not isinstance(result.payload, dict): + errs.append("power-status is expected to return a dict but got %s" % + type(result.payload)) + + if self.op.command in [ + constants.OOB_POWER_ON, + constants.OOB_POWER_OFF, + constants.OOB_POWER_CYCLE, + ]: + if result.payload is not None: + errs.append("%s is expected to not return payload but got '%s'" % + (self.op.command, result.payload)) + + if errs: + raise errors.OpExecError("Check of out-of-band payload failed due to %s" % + utils.CommaJoin(errs)) + + class LUDiagnoseOS(NoHooksLU): """Logical unit for OS diagnose/query.