# Buggy code
def call(self):
    """
    Call the module
    """
    ret = {}
    fun = self.opts["fun"]
    ret["jid"] = salt.utils.jid.gen_jid()
    proc_fn = os.path.join(salt.minion.get_proc_dir(self.opts["cachedir"]), ret["jid"])
    if fun not in self.minion.functions:
        sys.stderr.write(self.minion.functions.missing_fun_string(fun))
        mod_name = fun.split(".")[0]
        if mod_name in self.minion.function_errors:
            sys.stderr.write(
                " Possible reasons: {0}\n".format(self.minion.function_errors[mod_name])
            )
        else:
            sys.stderr.write("\n")
        sys.exit(-1)
    metadata = self.opts.get("metadata")
    if metadata is not None:
        metadata = salt.utils.args.yamlify_arg(metadata)
    try:
        sdata = {"fun": fun, "pid": os.getpid(), "jid": ret["jid"], "tgt": "salt-call"}
        if metadata is not None:
            sdata["metadata"] = metadata
        args, kwargs = salt.minion.load_args_and_kwargs(
            self.minion.functions[fun],
            salt.utils.args.parse_input(self.opts["arg"]),
            data=sdata,
        )
        try:
            with salt.utils.fopen(proc_fn, "w+b") as fp_:
                fp_.write(self.serial.dumps(sdata))
        except NameError:
            # Don't require msgpack with local
            pass
        except IOError:
            sys.stderr.write(
                "Cannot write to process directory. "
                "Do you have permissions to "
                "write to {0} ?\n".format(proc_fn)
            )
        func = self.minion.functions[fun]
        try:
            ret["return"] = func(*args, **kwargs)
        except TypeError as exc:
            sys.stderr.write("\nPassed invalid arguments: {0}.\n\nUsage:\n".format(exc))
            print_cli(func.__doc__)
            active_level = LOG_LEVELS.get(self.opts["log_level"].lower(), logging.ERROR)
            if active_level <= logging.DEBUG:
                trace = traceback.format_exc()
                sys.stderr.write(trace)
            sys.exit(salt.defaults.exitcodes.EX_GENERIC)
        try:
            ret["retcode"] = sys.modules[func.__module__].__context__.get("retcode", 0)
        except AttributeError:
            ret["retcode"] = 1
    except CommandExecutionError as exc:
        msg = "Error running '{0}': {1}\n"
        active_level = LOG_LEVELS.get(self.opts["log_level"].lower(), logging.ERROR)
        if active_level <= logging.DEBUG:
            sys.stderr.write(traceback.format_exc())
        sys.stderr.write(msg.format(fun, str(exc)))
        sys.exit(salt.defaults.exitcodes.EX_GENERIC)
    except CommandNotFoundError as exc:
        msg = "Command required for '{0}' not found: {1}\n"
        sys.stderr.write(msg.format(fun, str(exc)))
        sys.exit(salt.defaults.exitcodes.EX_GENERIC)
    try:
        os.remove(proc_fn)
    except (IOError, OSError):
        pass
    if hasattr(self.minion.functions[fun], "__outputter__"):
        oput = self.minion.functions[fun].__outputter__
        if isinstance(oput, six.string_types):
            ret["out"] = oput
    is_local = (
        self.opts["local"]
        or self.opts.get("file_client", False) == "local"
        or self.opts.get("master_type") == "disable"
    )
    returners = self.opts.get("return", "").split(",")
    if (not is_local) or returners:
        ret["id"] = self.opts["id"]
        ret["fun"] = fun
        ret["fun_args"] = self.opts["arg"]
        if metadata is not None:
            ret["metadata"] = metadata

    for returner in returners:
        if not returner:  # if we got an empty returner somehow, skip
            continue
        try:
            ret["success"] = True
            self.minion.returners["{0}.returner".format(returner)](ret)
        except Exception:
            pass

    # return the job infos back up to the respective minion's master
    if not is_local:
        try:
            mret = ret.copy()
            mret["jid"] = "req"
            self.return_pub(mret)
        except Exception:
            pass
    elif self.opts["cache_jobs"]:
        # Local job cache has been enabled
        salt.utils.minion.cache_jobs(self.opts, ret["jid"], ret)

    # close raet channel here
    return ret


# Traceback (RestException)
2017-03-13 11:19:26.095 [INFO] 10.234.112.46 >> POST http://10.234.112.107/api/1.8/host/salt-host
{
"wwnlist":"['0011223344556677', '1122334455667788']"
}
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/pure/rest/controller/util.py", line 97, in execute
(command, args) = get_args(command_list, version, params)
File "/usr/lib/python2.7/dist-packages/pure/rest/controller/util.py", line 392, in get_args
raise RestException("Value of argument {} needs to be one of {}.".format(key, arg.arg_type), Code.BAD_REQUEST)
RestException: Value of argument wwnlist needs to be one of ['list'].
2017-03-13 11:19:26.101 [WARNING] << 400 BAD REQUEST
{
"msg":"Value of argument wwnlist needs to be one of ['list']."
}

# Fixed code
def call(self):
    """
    Call the module
    """
    ret = {}
    fun = self.opts["fun"]
    ret["jid"] = salt.utils.jid.gen_jid()
    proc_fn = os.path.join(salt.minion.get_proc_dir(self.opts["cachedir"]), ret["jid"])
    if fun not in self.minion.functions:
        sys.stderr.write(self.minion.functions.missing_fun_string(fun))
        mod_name = fun.split(".")[0]
        if mod_name in self.minion.function_errors:
            sys.stderr.write(
                " Possible reasons: {0}\n".format(self.minion.function_errors[mod_name])
            )
        else:
            sys.stderr.write("\n")
        sys.exit(-1)
    metadata = self.opts.get("metadata")
    if metadata is not None:
        metadata = salt.utils.args.yamlify_arg(metadata)
    try:
        sdata = {"fun": fun, "pid": os.getpid(), "jid": ret["jid"], "tgt": "salt-call"}
        if metadata is not None:
            sdata["metadata"] = metadata
        args, kwargs = salt.minion.load_args_and_kwargs(
            self.minion.functions[fun],
            salt.utils.args.parse_input(
                self.opts["arg"], no_parse=self.opts.get("no_parse", [])
            ),
            data=sdata,
        )
        try:
            with salt.utils.fopen(proc_fn, "w+b") as fp_:
                fp_.write(self.serial.dumps(sdata))
        except NameError:
            # Don't require msgpack with local
            pass
        except IOError:
            sys.stderr.write(
                "Cannot write to process directory. "
                "Do you have permissions to "
                "write to {0} ?\n".format(proc_fn)
            )
        func = self.minion.functions[fun]
        try:
            ret["return"] = func(*args, **kwargs)
        except TypeError as exc:
            sys.stderr.write("\nPassed invalid arguments: {0}.\n\nUsage:\n".format(exc))
            print_cli(func.__doc__)
            active_level = LOG_LEVELS.get(self.opts["log_level"].lower(), logging.ERROR)
            if active_level <= logging.DEBUG:
                trace = traceback.format_exc()
                sys.stderr.write(trace)
            sys.exit(salt.defaults.exitcodes.EX_GENERIC)
        try:
            ret["retcode"] = sys.modules[func.__module__].__context__.get("retcode", 0)
        except AttributeError:
            ret["retcode"] = 1
    except CommandExecutionError as exc:
        msg = "Error running '{0}': {1}\n"
        active_level = LOG_LEVELS.get(self.opts["log_level"].lower(), logging.ERROR)
        if active_level <= logging.DEBUG:
            sys.stderr.write(traceback.format_exc())
        sys.stderr.write(msg.format(fun, str(exc)))
        sys.exit(salt.defaults.exitcodes.EX_GENERIC)
    except CommandNotFoundError as exc:
        msg = "Command required for '{0}' not found: {1}\n"
        sys.stderr.write(msg.format(fun, str(exc)))
        sys.exit(salt.defaults.exitcodes.EX_GENERIC)
    try:
        os.remove(proc_fn)
    except (IOError, OSError):
        pass
    if hasattr(self.minion.functions[fun], "__outputter__"):
        oput = self.minion.functions[fun].__outputter__
        if isinstance(oput, six.string_types):
            ret["out"] = oput
    is_local = (
        self.opts["local"]
        or self.opts.get("file_client", False) == "local"
        or self.opts.get("master_type") == "disable"
    )
    returners = self.opts.get("return", "").split(",")
    if (not is_local) or returners:
        ret["id"] = self.opts["id"]
        ret["fun"] = fun
        ret["fun_args"] = self.opts["arg"]
        if metadata is not None:
            ret["metadata"] = metadata

    for returner in returners:
        if not returner:  # if we got an empty returner somehow, skip
            continue
        try:
            ret["success"] = True
            self.minion.returners["{0}.returner".format(returner)](ret)
        except Exception:
            pass

    # return the job infos back up to the respective minion's master
    if not is_local:
        try:
            mret = ret.copy()
            mret["jid"] = "req"
            self.return_pub(mret)
        except Exception:
            pass
    elif self.opts["cache_jobs"]:
        # Local job cache has been enabled
        salt.utils.minion.cache_jobs(self.opts, ret["jid"], ret)

    # close raet channel here
    return ret