# Buggy code
def present(
    name,
    createdb=False,
    createuser=False,
    encrypted=False,
    superuser=False,
    replication=False,
    password=None,
    groups=None,
    runas=None,
    user=None,
):
    """
    Ensure that the named group is present with the specified privileges

    name
        The name of the group to manage

    createdb
        Is the group allowed to create databases?

    createuser
        Is the group allowed to create other users?

    encrypted
        Should the password be encrypted in the system catalog?

    superuser
        Should the new group be a "superuser"

    replication
        Should the new group be allowed to initiate streaming replication

    password
        The group's password

    groups
        A string of comma separated groups the group should be in

    runas
        System user all operations should be performed on behalf of

        .. deprecated:: 0.17.0

    user
        System user all operations should be performed on behalf of

        .. versionadded:: 0.17.0
    """
    ret = {
        "name": name,
        "changes": {},
        "result": True,
        "comment": "Group {0} is already present".format(name),
    }

    salt.utils.warn_until(
        (0, 18),
        "Please remove 'runas' support at this stage. 'user' support was "
        "added in 0.17.0",
        _dont_call_warnings=True,
    )
    if runas:
        # Warn users about the deprecation
        ret.setdefault("warnings", []).append(
            "The 'runas' argument is being deprecated in favor or 'user', "
            "please update your state files."
        )
    if user is not None and runas is not None:
        # user wins over runas but let warn about the deprecation.
        ret.setdefault("warnings", []).append(
            "Passed both the 'runas' and 'user' arguments. Please don't. "
            "'runas' is being ignored in favor of 'user'."
        )
        runas = None
    elif runas is not None:
        # Support old runas usage
        user = runas
        runas = None

    # check if user exists
    if __salt__["postgres.user_exists"](name, runas=user):
        return ret

    # The user is not present, make it!
    if __opts__["test"]:
        ret["result"] = None
        ret["comment"] = "Group {0} is set to be created".format(name)
        return ret
    if __salt__["postgres.group_create"](
        groupname=name,
        createdb=createdb,
        createuser=createuser,
        encrypted=encrypted,
        superuser=superuser,
        replication=replication,
        rolepassword=password,
        groups=groups,
        runas=user,
    ):
        ret["comment"] = "The group {0} has been created".format(name)
        ret["changes"][name] = "Present"
    else:
        ret["comment"] = "Failed to create group {0}".format(name)
        ret["result"] = False

    return ret


# Traceback (AttributeError)
[ERROR   ] Error in function _master_opts:
Traceback (most recent call last):
File "/usr/lib/pymodules/python2.7/salt/master.py", line 1444, in run_func
ret = getattr(self, func)(load)
File "/usr/lib/pymodules/python2.7/salt/master.py", line 891, in _master_opts
envs = self._file_envs()
File "/usr/lib/pymodules/python2.7/salt/fileserver/__init__.py", line 153, in envs
ret.update(self.servers[fstr]())
File "/usr/lib/pymodules/python2.7/salt/fileserver/hgfs.py", line 176, in envs
tags = repo.get_tags()
AttributeError: 'hgclient' object has no attribute 'get_tags'

# Fixed code
def present(
    name,
    createdb=False,
    createuser=False,
    encrypted=False,
    superuser=False,
    replication=False,
    password=None,
    groups=None,
    runas=None,
    user=None,
):
    """
    Ensure that the named group is present with the specified privileges

    name
        The name of the group to manage

    createdb
        Is the group allowed to create databases?

    createuser
        Is the group allowed to create other users?

    encrypted
        Should the password be encrypted in the system catalog?

    superuser
        Should the new group be a "superuser"

    replication
        Should the new group be allowed to initiate streaming replication

    password
        The group's password

    groups
        A string of comma separated groups the group should be in

    runas
        System user all operations should be performed on behalf of

        .. deprecated:: 0.17.0

    user
        System user all operations should be performed on behalf of

        .. versionadded:: 0.17.0
    """
    ret = {
        "name": name,
        "changes": {},
        "result": True,
        "comment": "Group {0} is already present".format(name),
    }

    salt.utils.warn_until(
        "Hydrogen",
        "Please remove 'runas' support at this stage. 'user' support was "
        "added in 0.17.0",
        _dont_call_warnings=True,
    )
    if runas:
        # Warn users about the deprecation
        ret.setdefault("warnings", []).append(
            "The 'runas' argument is being deprecated in favor or 'user', "
            "please update your state files."
        )
    if user is not None and runas is not None:
        # user wins over runas but let warn about the deprecation.
        ret.setdefault("warnings", []).append(
            "Passed both the 'runas' and 'user' arguments. Please don't. "
            "'runas' is being ignored in favor of 'user'."
        )
        runas = None
    elif runas is not None:
        # Support old runas usage
        user = runas
        runas = None

    # check if user exists
    if __salt__["postgres.user_exists"](name, runas=user):
        return ret

    # The user is not present, make it!
    if __opts__["test"]:
        ret["result"] = None
        ret["comment"] = "Group {0} is set to be created".format(name)
        return ret
    if __salt__["postgres.group_create"](
        groupname=name,
        createdb=createdb,
        createuser=createuser,
        encrypted=encrypted,
        superuser=superuser,
        replication=replication,
        rolepassword=password,
        groups=groups,
        runas=user,
    ):
        ret["comment"] = "The group {0} has been created".format(name)
        ret["changes"][name] = "Present"
    else:
        ret["comment"] = "Failed to create group {0}".format(name)
        ret["result"] = False

    return ret