# Buggy code
def apply_minion_config(
    overrides=None, defaults=None, cache_minion_id=False, minion_id=None
):
    """
    Returns minion configurations dict.
    """
    if defaults is None:
        defaults = DEFAULT_MINION_OPTS

    opts = defaults.copy()
    opts["__role"] = "minion"
    if overrides:
        opts.update(overrides)

    opts["__cli"] = os.path.basename(sys.argv[0])

    # No ID provided. Will getfqdn save us?
    using_ip_for_id = False
    if not opts.get("id"):
        if minion_id:
            opts["id"] = minion_id
        else:
            opts["id"], using_ip_for_id = get_id(opts, cache_minion_id=cache_minion_id)

    # it does not make sense to append a domain to an IP based id
    if not using_ip_for_id and "append_domain" in opts:
        opts["id"] = _append_domain(opts)

    for directory in opts.get("append_minionid_config_dirs", []):
        if directory in ["pki_dir", "cachedir", "extension_modules", "pidfile"]:
            newdirectory = os.path.join(opts[directory], opts["id"])
            opts[directory] = newdirectory

    if len(opts["sock_dir"]) > len(opts["cachedir"]) + 10:
        opts["sock_dir"] = os.path.join(opts["cachedir"], ".salt-unix")

    # Enabling open mode requires that the value be set to True, and
    # nothing else!
    opts["open_mode"] = opts["open_mode"] is True
    # Make sure ext_mods gets set if it is an untrue value
    # (here to catch older bad configs)
    opts["extension_modules"] = opts.get("extension_modules") or os.path.join(
        opts["cachedir"], "extmods"
    )
    # Set up the utils_dirs location from the extension_modules location
    opts["utils_dirs"] = opts.get("utils_dirs") or [
        os.path.join(opts["extension_modules"], "utils")
    ]

    # Insert all 'utils_dirs' directories to the system path
    insert_system_path(opts, opts["utils_dirs"])

    # Prepend root_dir to other paths
    prepend_root_dirs = [
        "pki_dir",
        "cachedir",
        "sock_dir",
        "extension_modules",
        "pidfile",
    ]

    # These can be set to syslog, so, not actual paths on the system
    for config_key in ("log_file", "key_logfile"):
        if urlparse(opts.get(config_key, "")).scheme == "":
            prepend_root_dirs.append(config_key)

    prepend_root_dir(opts, prepend_root_dirs)

    # if there is no beacons option yet, add an empty beacons dict
    if "beacons" not in opts:
        opts["beacons"] = {}

    if overrides.get("ipc_write_buffer", "") == "dynamic":
        opts["ipc_write_buffer"] = _DFLT_IPC_WBUFFER
    if "ipc_write_buffer" not in overrides:
        opts["ipc_write_buffer"] = 0

    # if there is no schedule option yet, add an empty scheduler
    if "schedule" not in opts:
        opts["schedule"] = {}

    # Make sure hash_type is lowercase
    opts["hash_type"] = opts["hash_type"].lower()

    return opts


# Traceback (OSError)
salt-proxy --proxyid=p8001 -l debug
[DEBUG   ] Reading configuration from /etc/salt/proxy
[DEBUG   ] Including configuration from '/etc/salt/proxy.d/_schedule.conf'
[DEBUG   ] Reading configuration from /etc/salt/proxy.d/_schedule.conf
[DEBUG   ] Configuration file path: /etc/salt/proxy
[WARNING ] Insecure logging configuration detected! Sensitive data may be logged.
[INFO    ] Setting up "p8001" the Salt ProxyMinion
[ERROR   ] Proxy Minion failed to start:
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/salt/scripts.py", line 249, in proxy_minion_process
proxyminion.start()
File "/usr/lib/python2.7/site-packages/salt/cli/daemons.py", line 515, in start
super(ProxyMinion, self).start()
File "/usr/lib/python2.7/site-packages/salt/utils/parsers.py", line 996, in start
self.prepare()
File "/usr/lib/python2.7/site-packages/salt/cli/daemons.py", line 494, in prepare
self.set_pidfile()
File "/usr/lib/python2.7/site-packages/salt/utils/parsers.py", line 931, in set_pidfile
set_pidfile(self.config['pidfile'], self.config['user'])
File "/usr/lib/python2.7/site-packages/salt/utils/process.py", line 75, in set_pidfile
os.makedirs(pdir)
File "/usr/lib64/python2.7/os.py", line 157, in makedirs
mkdir(name, mode)
OSError: [Errno 17] File exists: '/var/run/salt-minion.pid'
[WARNING ] ** Restarting proxy minion **
[INFO    ] Sleeping random_reauth_delay of 6 seconds
[DEBUG   ] Reading configuration from /etc/salt/proxy
[DEBUG   ] Including configuration from '/etc/salt/proxy.d/_schedule.conf'
[DEBUG   ] Reading configuration from /etc/salt/proxy.d/_schedule.conf
[DEBUG   ] Configuration file path: /etc/salt/proxy
[WARNING ] Insecure logging configuration detected! Sensitive data may be logged.
[INFO    ] Setting up "p8001" the Salt ProxyMinion
[ERROR   ] Proxy Minion failed to start:

# Fixed code
def apply_minion_config(
    overrides=None, defaults=None, cache_minion_id=False, minion_id=None
):
    """
    Returns minion configurations dict.
    """
    if defaults is None:
        defaults = DEFAULT_MINION_OPTS

    opts = defaults.copy()
    opts["__role"] = "minion"
    if overrides:
        opts.update(overrides)

    opts["__cli"] = os.path.basename(sys.argv[0])

    # No ID provided. Will getfqdn save us?
    using_ip_for_id = False
    if not opts.get("id"):
        if minion_id:
            opts["id"] = minion_id
        else:
            opts["id"], using_ip_for_id = get_id(opts, cache_minion_id=cache_minion_id)

    # it does not make sense to append a domain to an IP based id
    if not using_ip_for_id and "append_domain" in opts:
        opts["id"] = _append_domain(opts)

    for directory in opts.get("append_minionid_config_dirs", []):
        if directory in ["pki_dir", "cachedir", "extension_modules"]:
            newdirectory = os.path.join(opts[directory], opts["id"])
            opts[directory] = newdirectory

    # pidfile can be in the list of append_minionid_config_dirs, but pidfile
    # is the actual path with the filename, not a directory.
    if "pidfile" in opts.get("append_minionid_config_dirs", []):
        newpath_list = os.path.split(opts["pidfile"])
        opts["pidfile"] = os.path.join(
            newpath_list[0], "salt", opts["id"], newpath_list[1]
        )

    if len(opts["sock_dir"]) > len(opts["cachedir"]) + 10:
        opts["sock_dir"] = os.path.join(opts["cachedir"], ".salt-unix")

    # Enabling open mode requires that the value be set to True, and
    # nothing else!
    opts["open_mode"] = opts["open_mode"] is True
    # Make sure ext_mods gets set if it is an untrue value
    # (here to catch older bad configs)
    opts["extension_modules"] = opts.get("extension_modules") or os.path.join(
        opts["cachedir"], "extmods"
    )
    # Set up the utils_dirs location from the extension_modules location
    opts["utils_dirs"] = opts.get("utils_dirs") or [
        os.path.join(opts["extension_modules"], "utils")
    ]

    # Insert all 'utils_dirs' directories to the system path
    insert_system_path(opts, opts["utils_dirs"])

    # Prepend root_dir to other paths
    prepend_root_dirs = [
        "pki_dir",
        "cachedir",
        "sock_dir",
        "extension_modules",
        "pidfile",
    ]

    # These can be set to syslog, so, not actual paths on the system
    for config_key in ("log_file", "key_logfile"):
        if urlparse(opts.get(config_key, "")).scheme == "":
            prepend_root_dirs.append(config_key)

    prepend_root_dir(opts, prepend_root_dirs)

    # if there is no beacons option yet, add an empty beacons dict
    if "beacons" not in opts:
        opts["beacons"] = {}

    if overrides.get("ipc_write_buffer", "") == "dynamic":
        opts["ipc_write_buffer"] = _DFLT_IPC_WBUFFER
    if "ipc_write_buffer" not in overrides:
        opts["ipc_write_buffer"] = 0

    # if there is no schedule option yet, add an empty scheduler
    if "schedule" not in opts:
        opts["schedule"] = {}

    # Make sure hash_type is lowercase
    opts["hash_type"] = opts["hash_type"].lower()

    return opts