:orphan:
.. _release-3000:

=======================================
Salt 3000 Release Notes - Codename Neon
=======================================

Saltcheck Updates
=================

Available since 2018.3, the :py:func:`saltcheck module <salt.modules.saltcheck>`
has been enhanced to:

* Support saltenv environments
* Associate tests with states by naming convention
* Adds report_highstate_tests function
* Adds empty and notempty assertions
* Adds skip keyword
* Adds print_result keyword
* Adds assertion_section keyword
* Use saltcheck.state_apply to run state.apply for test setup or teardown
* Changes output to display test time
* Works with salt-ssh

Saltcheck provides unittest like functionality requiring only the knowledge of
salt module execution and yaml. Saltcheck uses salt modules to return data, then
runs an assertion against that return. This allows for testing with all the
features included in salt modules.

In order to run state and highstate saltcheck tests, a sub-folder in the state directory
must be created and named ``saltcheck-tests``. Tests for a state should be created in files
ending in ``*.tst`` and placed in the ``saltcheck-tests`` folder. ``tst`` files are run
through the salt rendering system, enabling tests to be written in yaml (or renderer of choice),
and include jinja, as well as the usual grain and pillar information. Like states, multiple tests can
be specified in a ``tst`` file. Multiple ``tst`` files can be created in the ``saltcheck-tests``
folder, and should be named the same as the associated state. The ``id`` of a test works in the
same manner as in salt state files and should be unique and descriptive.

Usage
-----

Example file system layout:

.. code-block:: text

    /srv/salt/apache/
        init.sls
        config.sls
        saltcheck-tests/
            init.tst
            config.tst
            deployment_validation.tst

Tests can be run for each state by name, for all ``apache/saltcheck/*.tst`` files,
or for all states assigned to the minion in top.sls. Tests may also be created
with no associated state. These tests will be run through the use of
``saltcheck.run_state_tests``, but will not be automatically run by
``saltcheck.run_highstate_tests``.

.. code-block:: bash

    salt '*' saltcheck.run_state_tests apache,apache.config
    salt '*' saltcheck.run_state_tests apache check_all=True
    salt '*' saltcheck.run_highstate_tests
    salt '*' saltcheck.run_state_tests apache.deployment_validation

Example Tests
-------------

.. code-block:: jinja

    {# will run the common salt state before further testing #}
    setup_test_environment:
      module_and_function: saltcheck.state_apply
      args:
        - common
      pillar-data:
        data: value

    {% for package in ["apache2", "openssh"] %}
    {# or another example #}
    {# for package in salt['pillar.get']("packages") #}
    jinja_test_{{ package }}_latest:
      module_and_function: pkg.upgrade_available
      args:
        - {{ package }}
      assertion: assertFalse
    {% endfor %}

    validate_user_present_and_shell:
      module_and_function: user.info
      args:
        - root
      assertion: assertEqual
      expected-return: /bin/bash
      assertion_section: shell
      print_result: False

    skip_test:
      module_and_function: pkg.upgrade_available
      args:
        - apache2
      assertion: assertFalse
      skip: True

Output Format Changes
---------------------

Saltcheck output has been enhanced to display the time taken per test. This results
in a change to the output format.

Previous Output:

.. code-block:: text

  local:
    |_
      ----------
      ntp:
          ----------
          ntp-client-installed:
              Pass
          ntp-service-status:
              Pass
    |_
      ----------
      TEST RESULTS:
          ----------
          Failed:
              0
          Missing Tests:
              0
          Passed:
              2

New output:

.. code-block:: text

  local:
    |_
      ----------
      ntp:
          ----------
          ntp-client-installed:
              ----------
              duration:
                  1.0408
              status:
                  Pass
          ntp-service-status:
              ----------
              duration:
                  1.464
              status:
                  Pass
    |_
      ----------
      TEST RESULTS:
          ----------
          Execution Time:
              2.5048
          Failed:
              0
          Missing Tests:
              0
          Passed:
              2
          Skipped:
              0


Unless and onlyif Enhancements
==============================

The ``unless`` and ``onlyif`` requisites can now be operated with salt modules.
The dictionary must contain an argument ``fun`` which is the module that is
being run, and everything else must be passed in under the args key or will be
passed as individual kwargs to the module function.

.. code-block:: yaml

  install apache on debian based distros:
    cmd.run:
      - name: make install
      - cwd: /path/to/dir/whatever-2.1.5/
      - unless:
        - fun: file.file_exists
          path: /usr/local/bin/whatever

.. code-block:: yaml

  set mysql root password:
    debconf.set:
      - name: mysql-server-5.7
      - data:
          'mysql-server/root_password': {'type': 'password', 'value': {{pillar['mysql.pass']}} }
      - unless:
        - fun: pkg.version
          args:
            - mysql-server-5.7

Keystore State and Module
=========================

A new :py:func:`state <salt.states.keystore>` and
:py:func:`execution module <salt.modules.keystore>` for manaing Java
Keystore files is now included. It allows for adding/removing/listing
as well as managing keystore files.

.. code-block:: bash

  # salt-call keystore.list /path/to/keystore.jks changeit
  local:
    |_
      ----------
      alias:
          hostname1
      expired:
          True
      sha1:
          CB:5E:DE:50:57:99:51:87:8E:2E:67:13:C5:3B:E9:38:EB:23:7E:40
      type:
          TrustedCertEntry
      valid_start:
          August 22 2012
      valid_until:
          August 21 2017

.. code-block:: yaml

  define_keystore:
    keystore.managed:
      - name: /tmp/statestore.jks
      - passphrase: changeit
      - force_remove: True
      - entries:
        - alias: hostname1
          certificate: /tmp/testcert.crt
        - alias: remotehost
          certificate: /tmp/512.cert
          private_key: /tmp/512.key
        - alias: stringhost
          certificate: |
            -----BEGIN CERTIFICATE-----
            MIICEjCCAX
            Hn+GmxZA
            -----END CERTIFICATE-----

XML Module
==========

A new state and execution module for editing XML files is now included. Currently it allows for
editing values from an xpath query, or editing XML IDs.

.. code-block:: bash

  # salt-call xml.set_attribute /tmp/test.xml ".//actor[@id='3']" editedby "Jane Doe"
  local:
      True
  # salt-call xml.get_attribute /tmp/test.xml ".//actor[@id='3']"
  local:
      ----------
      editedby:
          Jane Doe
      id:
          3
  # salt-call xml.get_value /tmp/test.xml ".//actor[@id='2']"
  local:
      Liam Neeson
  # salt-call xml.set_value /tmp/test.xml ".//actor[@id='2']" "Patrick Stewart"
  local:
      True
  # salt-call xml.get_value /tmp/test.xml ".//actor[@id='2']"
  local:
      Patrick Stewart

.. code-block:: yaml

    ensure_value_true:
      xml.value_present:
        - name: /tmp/test.xml
        - xpath: .//actor[@id='1']
        - value: William Shatner

Jinja enhancements
==================

Troubleshooting Jinja map files
-------------------------------

A new :py:func:`execution module <salt.modules.jinja>` for ``map.jinja`` troubleshooting
has been added.

Assuming the map is loaded in your formula SLS as follows:

.. code-block:: jinja

  {% from "myformula/map.jinja" import myformula with context %}

The following command can be used to load the map and check the results:

.. code-block:: bash

  salt myminion jinja.load_map myformula/map.jinja myformula

The module can be also used to test ``json`` and ``yaml`` maps:

.. code-block:: bash

  salt myminion jinja.import_yaml myformula/defaults.yaml

  salt myminion jinja.import_json myformula/defaults.json

json_query filter
-----------------

A port of Ansible :jinja_ref:`json_query` Jinja filter has been added. It allows
making queries against JSON data using `JMESPath language`_. Could be used to
filter ``pillar`` data, ``yaml`` maps, and also useful with :jinja_ref:`http_query`.

Depends on the `jmespath`_ Python module.

.. _`JMESPath language`: http://jmespath.org/
.. _`jmespath`: https://github.com/jmespath/jmespath.py

Slot Syntax Updates
===================

The slot syntax has been updated to support parsing dictionary responses and to append text.

.. code-block:: yaml

  demo dict parsing and append:
    test.configurable_test_state:
      - name: slot example
      - changes: False
      - comment: __slot__:salt:test.arg(shell="/bin/bash").kwargs.shell ~ /appended

.. code-block:: none

  local:
    ----------
          ID: demo dict parsing and append
    Function: test.configurable_test_state
        Name: slot example
      Result: True
     Comment: /bin/bash/appended
     Started: 09:59:58.623575
    Duration: 1.229 ms
     Changes:

Also, slot parsing is now supported inside of nested state data structures (dicts, lists, unless/onlyif args):

.. code-block:: yaml

  demo slot parsing for nested elements:
    file.managed:
      - name: /tmp/slot.txt
      - source: salt://slot.j2
      - template: jinja
      - context:
          # Slot inside of the nested context dictionary
          variable: __slot__:salt:test.echo(a_value)
      - unless:
        - fun: file.search
          args:
            # Slot as unless argument
            - __slot__:salt:test.echo(/tmp/slot.txt)
            - "DO NOT OVERRIDE"
          ignore_if_missing: True

- The :py:func:`file.symlink <salt.states.file.symlink>` state was
  fixed to remove existing file system entries other than files,
  directories and symbolic links properly.

- The ``onchanges`` and ``prereq`` :ref:`requisites <requisites>` now behave
  properly in test mode.

State Changes
=============

- Added new :py:func:`ssh_auth.manage <salt.states.ssh_auth.manage>` state to
  ensure only the specified ssh keys are present for the specified user.

- Added new :py:func:`saltutil <salt.states.saltutil>` state to use instead of
  ``module.run`` to more easily handle change.

- Added new `onfail_all` requisite form to allow for AND logic when adding
  onfail states.

Module Changes
==============

- The :py:func:`debian_ip <salt.modules.debian_ip>` module used by the
  :py:func:`network.managed <salt.states.network.managed>` state has been
  heavily refactored. The order that options appear in inet/inet6 blocks may
  produce cosmetic changes. Many options without an 'ipvX' prefix will now be
  shared between inet and inet6 blocks. The options ``enable_ipv4`` and
  ``enabled_ipv6`` will now fully remove relevant inet/inet6 blocks. Overriding
  options by prefixing them with 'ipvX' will now work with most options (i.e.
  ``dns`` can be overriden by ``ipv4dns`` or ``ipv6dns``). The ``proto`` option
  is now required.

- Added new :py:func:`boto_ssm <salt.modules.boto_ssm>` module to set and query
  secrets in AWS SSM parameters.

- Added new :py:func:`flatpak <salt.modules.flatpak>` module to work with flatpak packages.
  
- The :py:func:`file.set_selinux_context <salt.modules.file.set_selinux_context>`
  module now supports perstant changes with ``persist=True`` by calling the
  :py:func:`selinux.fcontext_add_policy <salt.modules.selinux.fcontext_add_policy>` module.

- The :py:func:`file.remove <salt.modules.file.remove>` module was
  fixed to remove file system entries other than files, directories
  and symbolic links properly.

- The :py:func:`yumpkg <salt.modules.yumpkg>` module has been updated to support
  VMWare's Photon OS, which uses tdnf (a C implementation of dnf).

- The :py:func:`chocolatey.bootstrap <salt.modules.chocolatey.bootstrap>` function
  has been updated to support offline installation.

- The :py:func:`chocolatey.unbootstrap <salt.modules.chocolatey.unbootstrap>` function
  has been added to uninstall Chocolatey.

Enhancements to Engines
=======================

Multiple copies of a particular Salt engine can be configured by including
the ``engine_module`` parameter in the engine configuration.

.. code-block:: yaml

   engines:
     - production_logstash:
         host: production_log.my_network.com
         port: 5959
         proto: tcp
         engine_module: logstash
     - develop_logstash:
         host: develop_log.my_network.com
         port: 5959
         proto: tcp
         engine_module: logstash

Runner Changes
==============

- The :py:func:`saltutil.sync_auth <salt.runners.saltutil.sync_auth>` function
  has been added to sync loadable auth modules. :py:func:`saltutil.sync_all <salt.runners.saltutil.sync_all>`
  will also include these modules.

Util Changes
============

- The :py:func:`win_dotnet <salt.utils.win_dotnet>` Salt util has been added to
  make it easier to detect the versions of .NET installed on the system. It includes
  the following functions:

    - :py:func:`versions <salt.utils.win_dotnet.versions>`
    - :py:func:`versions_list <salt.utils.win_dotnet.versions_list>`
    - :py:func:`versions_details <salt.utils.win_dotnet.versions_details>`
    - :py:func:`version_at_least <salt.utils.win_dotnet.version_at_least>`

Serializer Changes
==================

- The configparser serializer and deserializer functions can now be made to preserve
  case of item names by passing 'preserve_case=True' in the options parameter of the function.

  .. note::
      This is a parameter consumed only by the salt.serializer.configparser serialize and
      deserialize functions and not the low-level configparser python object.

  For example, in a file.serialze state:

  .. code-block:: yaml

    some.ini:
      - file.serialize:
         - formatter: configparser
         - merge_if_exists: True
         - deserializer_opts:
           - preserve_case: True
         - serializer_opts:
           - preserve_case: True

Enhancements to Engines
=======================

- A new :py:func:`fluent engine <salt.engines.salt.engines.fluent>` has been
  added to export Salt events to fluentd.

  .. code-block:: yaml

    engines:
      - fluent
          host: localhost
          port: 24224

  .. code-block::

    <source>
      @type forward
      port 24224
    </source>
    <match saltstack.**>
      @type file
      path /var/log/td-agent/saltstack
    </match>

Module Changes
==============

- Added new :py:func:`boto_ssm <salt.modules.boto_ssm>` module to set and query
  secrets in AWS SSM parameters.

Deprecations
============

Raet Deprecated
---------------
- The Raet transport has been deprecated. Please use the supported
  transport protocols tcp or zeromq.

Module Deprecations
-------------------

- The hipchat module has been removed due to the service being retired.
  :py:func:`Google Chat <salt.modules.google_chat>`,
  :py:func:`MS Teams <salt.modules.msteams>`, or
  :py:func:`Slack <salt.modules.slack_notify>` may be suitable replacements.

- The :py:mod:`dockermod <salt.modules.dockermod>` module has been
  changed as follows:

    - Support for the ``tags`` kwarg has been removed from the
      :py:func:`dockermod.resolve_tag <salt.modules.dockermod.resolve_tag>`
      function.
    - Support for the ``network_id`` kwarg has been removed from the
      :py:func:`dockermod.connect_container_to_network <salt.modules.dockermod.connect_container_to_network>`
      function. Please use ``net_id`` instead.
    - Support for the ``name`` kwarg has been removed from the
      :py:func:`dockermod.sls_build <salt.modules.dockermod.sls_build>`
      function. Please use ``repository`` and ``tag`` instead.
    - Support for the ``image`` kwarg has been removed from the following
      functions. In all cases, please use both the ``repository`` and ``tag``
      options instead:

        - :py:func:`dockermod.build <salt.modules.dockermod.build>`
        - :py:func:`dockermod.commit <salt.modules.dockermod.commit>`
        - :py:func:`dockermod.import <salt.modules.dockermod.import_>`
        - :py:func:`dockermod.load <salt.modules.dockermod.load>`
        - :py:func:`dockermod.tag <salt.modules.dockermod.tag_>`

- The heat module has removed the ``enviroment`` kwarg from the
  :py:func:`heat.create_stack <salt.modules.heat.create_stack>` and
  :py:func:`heat.update_stack <salt.modules.heat.update_stack>` functions due
  to a spelling error. Please use ``environment`` instead.

- The :py:mod:`ssh <salt.modules.ssh>` execution module has been
  changed as follows:

    - Support for the ``ssh.get_known_host`` function has been removed. Please use the
      :py:func:`ssh.get_known_host_entries <salt.modules.ssh.get_known_host_entries>`
      function instead.
    - Support for the ``ssh.recv_known_host`` function has been removed. Please use the
      :py:func:`ssh.recv_known_host_entries <salt.modules.ssh.recv_known_host_entries>`
      function instead.

- The :py:mod`firewalld <salt.modules.firewalld>` module has been changed as
  follows:

    - The default setting for the ``force_masquerade`` option in the
      :py:func:`firewalld.add_port <salt.module.firewalld.add_port` function has changed
      from ``True`` to ``False``.
    - Support for the ``force_masquerade`` option in the
      :py:func:`firewalld.add_port_fwd <salt.module.firewalld.add_port_fwd` function has
      been changed from ``True`` to ``False``.

State Deprecations
------------------

- The hipchat state has been removed due to the service being retired.
  :py:func:`MS Teams <salt.states.msteams>` or
  :py:func:`Slack <salt.states.slack>` may be suitable replacements.

- The cmd state module has removed the ``quiet`` kwarg from the
  :py:func:`cmd.run <salt.states.cmd.run>` function. Please
  set ``output_loglevel`` to ``quiet`` instead.

- The heat state module has removed the ``enviroment`` kwarg from the
  :py:func:`heat.deployed <salt.states.heat.deployed>` function due
  to a spelling error. Please use ``environment`` instead.

- The :py:mod`firewalld <salt.states.firewalld>` state has been changed as follows:

    - The default setting for the ``prune_services`` option in the
      :py:func:`firewalld.present <salt.states.firewalld.present>` function has changed
      from ``True`` to ``False``.

Fileserver Deprecations
-----------------------

- The hgfs fileserver had the following config options removed:

    - The ``hgfs_env_whitelist`` config option has been removed in favor of ``hgfs_saltenv_whitelist``.
    - The ``hgfs_env_blacklist`` config option has been removed in favor of ``hgfs_saltenv_blacklist``.

- The svnfs fileserver had the following config options removed:

    - The ``svnfs_env_whitelist`` config option has been removed in favor of ``svnfs_saltenv_whitelist``.
    - The ``svnfs_env_blacklist`` config option has been removed in favor of ``svnfs_saltenv_blacklist``.

- The gitfs fileserver had the following config options removed:

    - The ``gitfs_env_whitelist`` config option has been removed in favor of ``gitfs_saltenv_whitelist``.
    - The ``gitfs_env_blacklist`` config option has been removed in favor of ``gitfs_saltenv_blacklist``.

Engine Removal
--------------

- The hipchat engine has been removed due to the service being retired. For users migrating
  to Slack, the :py:func:`slack <salt.engines.slack>` engine may be a suitable replacement.

Returner Removal
----------------

- The hipchat returner has been removed due to the service being retired. For users migrating
  to Slack, the :py:func:`slack <salt.returners.slack_returner>` returner may be a suitable
  replacement.

Grain Deprecations
------------------

For ``smartos`` some grains have been deprecated. These grains have been removed.

  - The ``hypervisor_uuid`` has been replaced with ``mdata:sdc:server_uuid`` grain.
  - The ``datacenter`` has been replaced with ``mdata:sdc:datacenter_name`` grain.

Cloud Deprecations
------------------

- The nova cloud driver has been removed in favor of the openstack cloud driver.


Jinja Filter Deprecations
-------------------------

- The following jinja filters are set to be removed in the Aluminium release:

  - :jinja_ref:`json_decode_dict` in favor of :jinja_ref:`tojson`
  - :jinja_ref:`json_decode_list` in favor of :jinja_ref:`tojson`

Utils Deprecations
------------------
- All of the functions in salt.utils.__init__.py have been removed. These
  include:

    - `salt.utils.option`
    - `salt.utils.required_module_list`
    - `salt.utils.required_modules_error`
    - `salt.utils.get_accumulator_dir`. Please use :py:func:`salt.state.get_accumulator_dir` instead.
    - `salt.utils.fnmatch_multiple`. Please use :py:func:`salt.utils.itertools.fnmatch_multiple` instead.
    - `salt.utils.appendproctitle`. Please use :py:func:`salt.utils.process.appendproctitle` instead.
    - `salt.utils.daemonize`. Please use :py:func:`salt.utils.process.daemonize` instead.
    - `salt.utils.daemonize_if`. Please use :py:func:`salt.utils.process.daemonize_if` instead.
    - `salt.utils.reinit_crypto`. Please use :py:func:`salt.utils.crypt.reinit_crypto` instead.
    - `salt.utils.pem_finger`. Please use :py:func:`salt.utils.crypt.pem_finger` instead.
    - `salt.utils.to_bytes`. Please use :py:func:`salt.utils.stringutils.to_bytes` instead.
    - `salt.utils.to_str`. Please use :py:func:`salt.utils.stringutils.to_str` instead.
    - `salt.utils.to_unicode`. Please use :py:func:`salt.utils.stringutils.to_unicode` instead.
    - `salt.utils.str_to_num`. Please use :py:func:`salt.utils.stringutils.to_num` instead.
    - `salt.utils.is_quoted`. Please use :py:func:`salt.utils.stringutils.is_quoted` instead.
    - `salt.utils.dequote`. Please use :py:func:`salt.utils.stringutils.dequote` instead.
    - `salt.utils.is_hex`. Please use :py:func:`salt.utils.stringutils.is_hex` instead.
    - `salt.utils.is_bin_str`. Please use :py:func:`salt.utils.stringutils.is_binary` instead.
    - `salt.utils.rand_string`. Please use :py:func:`salt.utils.stringutils.random` instead.
    - `salt.utils.contains_whitespace`. Please use :py:func:`salt.utils.stringutils.contains_whitespace` instead.
    - `salt.utils.build_whitespace_split_regex`. Please use :py:func:`salt.utils.stringutils.build_whitespace_split_regex` instead.
    - `salt.utils.expr_match`. Please use :py:func:`salt.utils.stringutils.expr_match` instead.
    - `salt.utils.check_whitelist_blacklist`. Please use :py:func:`salt.utils.stringutils.check_whitelist_blacklist` instead.
    - `salt.utils.check_include_exclude`.Please use :py:func:`salt.utils.stringutils.check_include_exclude` instead.
    - `salt.utils.print_cli`.Please use :py:func:`salt.utils.stringutils.print_cli` instead.
    - `salt.utils.clean_kwargs`.Please use :py:func:`salt.utils.args.clean_kwargs` instead.
    - `salt.utils.invalid_kwargs`.Please use :py:func:`salt.utils.args.invalid_kwargs` instead.
    - `salt.utils.shlex_split`.Please use :py:func:`salt.utils.args.shlex_split` instead.
    - `salt.utils.arg_lookup`.Please use :py:func:`salt.utils.args.arg_lookup` instead.
    - `salt.utils.argspec_report`.Please use :py:func:`salt.utils.args.argspec_report` instead.
    - `salt.utils.split_input`.Please use :py:func:`salt.utils.args.split_input` instead.
    - `salt.utils.test_mode`.Please use :py:func:`salt.utils.args.test_mode` instead.
    - `salt.utils.format_call`.Please use :py:func:`salt.utils.args.format_call` instead.
    - `salt.utils.which`.Please use :py:func:`salt.utils.path.which` instead.
    - `salt.utils.which_bin`.Please use :py:func:`salt.utils.path.which_bin` instead.
    - `salt.utils.path_join`.Please use :py:func:`salt.utils.path.join` instead.
    - `salt.utils.check_or_die`.Please use :py:func:`salt.utils.path.check_or_die` instead.
    - `salt.utils.sanitize_win_path_string`.Please use :py:func:`salt.utils.path.sanitize_win_path` instead.
    - `salt.utils.rand_str`.Please use :py:func:`salt.utils.hashutils.random_hash` instead.
    - `salt.utils.get_hash`.Please use :py:func:`salt.utils.hashutils.get_hash` instead.
    - `salt.utils.is_windows`.Please use :py:func:`salt.utils.platform.is_windows` instead.
    - `salt.utils.is_proxy`.Please use :py:func:`salt.utils.platform.is_proxy` instead.
    - `salt.utils.is_linux`.Please use :py:func:`salt.utils.platform.is_linux` instead.
    - `salt.utils.is_darwin`.Please use :py:func:`salt.utils.platform.is_darwin` instead.
    - `salt.utils.is_sunos`.Please use :py:func:`salt.utils.platform.is_sunos` instead.
    - `salt.utils.is_smartos`.Please use :py:func:`salt.utils.platform.is_smartos` instead.
    - `salt.utils.is_smartos_globalzone`.Please use :py:func:`salt.utils.platform.is_smartos_globalzone` instead.
    - `salt.utils.is_smartos_zone`.Please use :py:func:`salt.utils.platform.is_smartos_zone` instead.
    - `salt.utils.is_freebsd`.Please use :py:func:`salt.utils.platform.is_freebsd` instead.
    - `salt.utils.is_netbsd`.Please use :py:func:`salt.utils.platform.is_netbsd` instead.
    - `salt.utils.is_openbsd`.Please use :py:func:`salt.utils.platform.is_openbsd` instead.
    - `salt.utils.is_aix`.Please use :py:func:`salt.utils.platform.is_aix` instead.
    - `salt.utils.safe_rm`.Please use :py:func:`salt.utils.files.safe_rm` instead.
    - `salt.utils.is_empty`.Please use :py:func:`salt.utils.files.is_empty` instead.
    - `salt.utils.fopen`.Please use :py:func:`salt.utils.files.fopen` instead.
    - `salt.utils.flopen`.Please use :py:func:`salt.utils.files.flopen` instead.
    - `salt.utils.fpopen`.Please use :py:func:`salt.utils.files.fpopen` instead.
    - `salt.utils.rm_rf`.Please use :py:func:`salt.utils.files.rm_rf` instead.
    - `salt.utils.mkstemp`.Please use :py:func:`salt.utils.files.mkstemp` instead.
    - `salt.utils.istextfile`.Please use :py:func:`salt.utils.files.is_text_file` instead.
    - `salt.utils.is_bin_file`.Please use :py:func:`salt.utils.files.is_binary` instead.
    - `salt.utils.list_files`.Please use :py:func:`salt.utils.files.list_files` instead.
    - `salt.utils.safe_walk`.Please use :py:func:`salt.utils.files.safe_walk` instead.
    - `salt.utils.st_mode_to_octal`.Please use :py:func:`salt.utils.files.st_mode_to_octal` instead.
    - `salt.utils.normalize_mode`.Please use :py:func:`salt.utils.files.normalize_mode` instead.
    - `salt.utils.human_size_to_bytes`.Please use :py:func:`salt.utils.files.human_size_to_bytes` instead.
    - `salt.utils.backup_minion`.Please use :py:func:`salt.utils.files.backup_minion` instead.
    - `salt.utils.str_version_to_evr`.Please use :py:func:`salt.utils.pkg.rpm.version_to_evr` instead.
    - `salt.utils.parse_docstring`.Please use :py:func:`salt.utils.doc.parse_docstring` instead.
    - `salt.utils.compare_versions`.Please use :py:func:`salt.utils.versions.compare` instead.
    - `salt.utils.version_cmp`.Please use :py:func:`salt.utils.versions.version_cmp` instead.
    - `salt.utils.warn_until`.Please use :py:func:`salt.utils.versions.warn_until` instead.
    - `salt.utils.kwargs_warn_until`.Please use :py:func:`salt.utils.versions.kwargs_warn_until` instead.
    - `salt.utils.get_color_theme`.Please use :py:func:`salt.utils.color.get_color_theme` instead.
    - `salt.utils.get_colors`.Please use :py:func:`salt.utils.color.get_colors` instead.
    - `salt.utils.gen_state_tag`.Please use :py:func:`salt.utils.state.gen_tag` instead.
    - `salt.utils.search_onfail_requisites`.Please use :py:func:`salt.utils.state.search_onfail_requisites` instead.
    - `salt.utils.check_onfail_requisites`.Please use :py:func:`salt.utils.state.check_onfail_requisites` instead.
    - `salt.utils.check_state_result`.Please use :py:func:`salt.utils.state.check_result` instead.
    - `salt.utils.get_user`.Please use :py:func:`salt.utils.user.get_user` instead.
    - `salt.utils.get_uid`.Please use :py:func:`salt.utils.user.get_uid` instead.
    - `salt.utils.get_specific_user`.Please use :py:func:`salt.utils.user.get_specific_user` instead.
    - `salt.utils.chugid`.Please use :py:func:`salt.utils.user.chugid` instead.
    - `salt.utils.chugid_and_umask`.Please use :py:func:`salt.utils.user.chugid_and_umask` instead.
    - `salt.utils.get_default_group`.Please use :py:func:`salt.utils.user.get_default_group` instead.
    - `salt.utils.get_group_list`.Please use :py:func:`salt.utils.user.get_group_list` instead.
    - `salt.utils.get_group_dict`.Please use :py:func:`salt.utils.user.get_group_dict` instead.
    - `salt.utils.get_gid_list`.Please use :py:func:`salt.utils.user.get_gid_list` instead.
    - `salt.utils.get_gid`.Please use :py:func:`salt.utils.user.get_gid` instead.
    - `salt.utils.enable_ctrl_logoff_handler`.Please use :py:func:`salt.utils.win_functions.enable_ctrl_logoff_handler` instead.
    - `salt.utils.traverse_dict`.Please use :py:func:`salt.utils.data.traverse_dict` instead.
    - `salt.utils.traverse_dict_and_list`.Please use :py:func:`salt.utils.data.traverse_dict_and_list` instead.
    - `salt.utils.filter_by`.Please use :py:func:`salt.utils.data.filter_by` instead.
    - `salt.utils.subdict_match`.Please use :py:func:`salt.utils.data.subdict_match` instead.
    - `salt.utils.substr_in_list`.Please use :py:func:`salt.utils.data.substr_in_list` instead.
    - `salt.utils.is_dictlist`.Please use :py:func:`salt.utils.data.is_dictlist` instead.
    - `salt.utils.repack_dictlist`.Please use :py:func:`salt.utils.data.repack_dictlist` instead.
    - `salt.utils.compare_dicts`.Please use :py:func:`salt.utils.data.compare_dicts` instead.
    - `salt.utils.compare_lists`.Please use :py:func:`salt.utils.data.compare_lists` instead.
    - `salt.utils.decode_dict`.Please use :py:func:`salt.utils.data.encode_dict` instead.
    - `salt.utils.decode_list`.Please use :py:func:`salt.utils.data.encode_list` instead.
    - `salt.utils.exactly_n`.Please use :py:func:`salt.utils.data.exactly_n` instead.
    - `salt.utils.exactly_one`.Please use :py:func:`salt.utils.data.exactly_one` instead.
    - `salt.utils.is_list`.Please use :py:func:`salt.utils.data.is_list` instead.
    - `salt.utils.is_iter`.Please use :py:func:`salt.utils.data.is_iter` instead.
    - `salt.utils.isorted`.Please use :py:func:`salt.utils.data.sorted_ignorecase` instead.
    - `salt.utils.is_true`.Please use :py:func:`salt.utils.data.is_true` instead.
    - `salt.utils.mysql_to_dict`.Please use :py:func:`salt.utils.data.mysql_to_dict` instead.
    - `salt.utils.simple_types_filter`.Please use :py:func:`salt.utils.data.simple_types_filter` instead.
    - `salt.utils.ip_bracket`.Please use :py:func:`salt.utils.zeromq.ip_bracket` instead.
    - `salt.utils.gen_mac`.Please use :py:func:`salt.utils.network.gen_mac` instead.
    - `salt.utils.mac_str_to_bytes`.Please use :py:func:`salt.utils.network.mac_str_to_bytes` instead.
    - `salt.utils.refresh_dns`.Please use :py:func:`salt.utils.network.refresh_dns` instead.
    - `salt.utils.dns_check`.Please use :py:func:`salt.utils.network.dns_check` instead.
    - `salt.utils.get_context`.Please use :py:func:`salt.utils.stringutils.get_context` instead.
    - `salt.utils.get_master_key`.Please use :py:func:`salt.utils.master.get_master_key` instead.
    - `salt.utils.get_values_of_matching_keys`.Please use :py:func:`salt.utils.master.get_values_of_matching_keys` instead.
    - `salt.utils.date_cast`.Please use :py:func:`salt.utils.dateutils.date_cast` instead.
    - `salt.utils.date_format`.Please use :py:func:`salt.utils.dateutils.strftime` instead.
    - `salt.utils.total_seconds`.Please use :py:func:`salt.utils.dateutils.total_seconds` instead.
    - `salt.utils.find_json`.Please use :py:func:`salt.utils.json.find_json` instead.
    - `salt.utils.import_json`.Please use :py:func:`salt.utils.json.import_json` instead.
    - `salt.utils.namespaced_function`.Please use :py:func:`salt.utils.functools.namespaced_function` instead.
    - `salt.utils.alias_function`.Please use :py:func:`salt.utils.functools.alias_function` instead.
    - `salt.utils.profile_func`.Please use :py:func:`salt.utils.profile.profile_func` instead.
    - `salt.utils.activate_profile`.Please use :py:func:`salt.utils.profile.activate_profile` instead.
    - `salt.utils.output_profile`.Please use :py:func:`salt.utils.profile.output_profile` instead.

salt.auth.Authorize Class Removal
---------------------------------
- The salt.auth.Authorize Class inside of the `salt/auth/__init__.py` file has been removed and
  the `any_auth` method inside of the file `salt/utils/minions.py`. These method and classes were
  not being used inside of the salt code base.
