Salt 3000 Release Notes - Codename Neon

Security Advisory

For historical reasons, Salt requires PyCrypto as a "lowest common denominator". However, PyCrypto is unmaintained and best practice is to manually upgrade to use a more maintained library such as PyCryptodome. See Issue #52674 and Issue #54115 for more info

New Versioning

The neon release has removed the date versioning. Going forward we will use a non-date based version schema beginning at 3000. The version will be MAJOR.PATCH. For a planned release containing features and/or bug fixes the MAJOR version will be incremented. Please review the approved SEP for further details.

The new versioning scheme is PEP 440 compliant, but distutils.StrictVersion will result in an error invalid version number. If using StrictVersion to compare Salt's versions, please use LooseVersion. There is also the packaging library you can use to compare versions. Another alternative is using the salt version module

Python 3.8 Not Supported

Please note that running Salt with Python 3.8 is currently not supported. It is recommended to not use a version higher than 3.7.

Vendored Tornado Code Base

The Tornado code base has been included as salt.ext.tornado. This was done to provide a consistent version of Tornado across all operating systems while we continue to work on upgrading Tornado to a recent version. New code that uses Tornado should import the module from salt.ext.tornado instead of importing the system version of Tornado.

Msgpack 1.0.0rc1 Incompatibility

Salt is currently incompatible with msgpack 1.0.0rc1. We recommend using versions < 1.0.0 . This impacts the Salt Master's ability to run commands against minions. Please see Issue 56007 for more details and updates.

Pip Installing Salt On Windows

This release will not install correctly on windows when using pip to install salt. This issue is addressed in PR 56099. The workaround for this issue is:

pip install "pywin32==224" "WMI==1.4.9"

Those using the Salt Windows Installer are not affected by this issue.

Saltcheck Updates

Available since 2018.3, the saltcheck module 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:

/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.

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

{# 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:

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

New output:

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.

Note

Certain states have an unless/onlyif implementation that predates this feature, and may not work as expected:

  • states.git

  • states.cmd

  • states.macpackage

  • states.file

  • states.docker_container

Examples:

check external ip address:
  http.query:
    - name: https://icanhazip.com
    - status: 200
    - onlyif:
      - fun: file.file_exists
        path: /usr/local/bin/whatever

is equivalent to

check another ip address:
  http.query:
    - name: https://icanhazip.com
    - status: 200
    - onlyif:
      - test -f /tmp/fnord.txt

Another example:

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 state and execution module for manaing Java Keystore files is now included. It allows for adding/removing/listing as well as managing keystore files.

# 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
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.

# 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
ensure_value_true:
  xml.value_present:
    - name: /tmp/test.xml
    - xpath: .//actor[@id='1']
    - value: William Shatner

LGPO Execution Module

Multiple fixes were made to the win_lgpo to expand support for additional policies and improve performance. Issues with encoding and unsupported characters (smart-quotes, em-dash, etc) found in the ADML files as well as whitespace in some policies have been addressed.

Speed enhancements include:

  • Caching the compiled xml from ADMX/ADML files in __context__

  • Lowercasing all keys before compiling XML to remove an expensive XPath lookup

Additional functionality:

  • Adds the lgpo.get_policy function that allows you to get the current settings for a single policy.

  • Changes some policy names that were overly long

LGPO State Module

Multiple changes were made to the win_lgpo state to improve performance.

It now uses the lgpo.get_policy function instead of the lgpo.get to avoid reloading all settings on the machine at the beginning and end of each state run.

Supports the new shorter policy names but also attempts to resolve the older, longer policy names.

Win_network Salt Util

Now uses .NET libraries to obtain Interface information on Windows systems that support it. Unsupported systems fall back to the more expensive WMI calls. This is important as this data is gathered for grains and occurs each time a process is forked.

Jinja enhancements

Troubleshooting Jinja map files

A new execution module for map.jinja troubleshooting has been added.

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

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

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

salt myminion jinja.load_map myformula/map.jinja myformula

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

salt myminion jinja.import_yaml myformula/defaults.yaml

salt myminion jinja.import_json myformula/defaults.json

json_query filter

A port of Ansible 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 http_query.

Depends on the jmespath Python module.

Slot Syntax Updates

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

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
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):

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

State Changes

  • The file.symlink state was fixed to remove existing file system entries other than files, directories and symbolic links properly.

  • The onchanges and prereq requisites now behave properly in test mode, due to removing pchanges.

  • Added new ssh_auth.manage state to ensure only the specified ssh keys are present for the specified user.

  • Added new saltutil state to use instead of module.run to more easily handle change.

Module Changes

  • Added new boto_ssm module to set and query secrets in AWS SSM parameters.

  • Added new flatpak module to work with flatpak packages.

  • The file.remove module was fixed to remove file system entries other than files, directories and symbolic links properly.

  • The debian_ip module used by the 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 overridden by ipv4dns or ipv6dns). The proto option is now required.

Enhancements to Engines

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

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
  • A new fluent engine has been added to export Salt events to fluentd.

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

Enhancements to Beacons

Multiple copies of a particular Salt beacon can be configured by including the beacon_module parameter in the beacon configuration.

beacons:
  watch_importand_file:
    - files:
        /etc/important_file: {}
    - beacon_module: inotify
  watch_another_file:
    - files:
        /etc/another_file: {}
    - beacon_module: inotify

Enhancements to chroot

  • New functions added to chroot apply, sls, and highstate that allow executing states in sls files or running apply/highstate inside of a chroot.

Minion-side ACL

Salt has had master-side ACL for the salt mine for some time, where the master configuration contained mine_get that specified which minions could request which functions. However, now you can specify which minions can access a function in the salt mine function definition itself (or when calling mine.send). This targeting works the same as the generic minion targeting as specified here. The parameters used are allow_tgt and allow_tgt_type. See also the documentation of the Salt Mine. Please note that if you want to use this new feature both your minion and masters will need to be on atleast version 3000.

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. Google Chat, MS Teams, or Slack may be suitable replacements.

  • The dockermod module has been changed as follows:

    • Support for the tags kwarg has been removed from the dockermod.resolve_tag function.

    • Support for the network_id kwarg has been removed from the dockermod.connect_container_to_network function. Please use net_id instead.

    • Support for the name kwarg has been removed from the 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:

      • dockermod.build

      • dockermod.commit

      • dockermod.import

      • dockermod.load

      • dockermod.tag

  • The heat module has removed the enviroment kwarg from the heat.create_stack and heat.update_stack functions due to a spelling error. Please use environment instead.

  • The ssh execution module has been changed as follows:

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

    • The default setting for the force_masquerade option in the firewalld.add_port <salt.module.firewalld.add_port() function has changed from True to False.

    • Support for the force_masquerade option in the 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. MS Teams or Slack may be suitable replacements.

  • The cmd state module has removed the quiet kwarg from the cmd.run function. Please set output_loglevel to quiet instead.

  • The heat state module has removed the enviroment kwarg from the 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 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 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 slack 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

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 salt.state.get_accumulator_dir() instead.

    • salt.utils.fnmatch_multiple. Please use salt.utils.itertools.fnmatch_multiple() instead.

    • salt.utils.appendproctitle. Please use salt.utils.process.appendproctitle() instead.

    • salt.utils.daemonize. Please use salt.utils.process.daemonize() instead.

    • salt.utils.daemonize_if. Please use salt.utils.process.daemonize_if() instead.

    • salt.utils.reinit_crypto. Please use salt.utils.crypt.reinit_crypto() instead.

    • salt.utils.pem_finger. Please use salt.utils.crypt.pem_finger() instead.

    • salt.utils.to_bytes. Please use salt.utils.stringutils.to_bytes() instead.

    • salt.utils.to_str. Please use salt.utils.stringutils.to_str() instead.

    • salt.utils.to_unicode. Please use salt.utils.stringutils.to_unicode() instead.

    • salt.utils.str_to_num. Please use salt.utils.stringutils.to_num() instead.

    • salt.utils.is_quoted. Please use salt.utils.stringutils.is_quoted() instead.

    • salt.utils.dequote. Please use salt.utils.stringutils.dequote() instead.

    • salt.utils.is_hex. Please use salt.utils.stringutils.is_hex() instead.

    • salt.utils.is_bin_str. Please use salt.utils.stringutils.is_binary() instead.

    • salt.utils.rand_string. Please use salt.utils.stringutils.random() instead.

    • salt.utils.contains_whitespace. Please use salt.utils.stringutils.contains_whitespace() instead.

    • salt.utils.build_whitespace_split_regex. Please use salt.utils.stringutils.build_whitespace_split_regex() instead.

    • salt.utils.expr_match. Please use salt.utils.stringutils.expr_match() instead.

    • salt.utils.check_whitelist_blacklist. Please use salt.utils.stringutils.check_whitelist_blacklist() instead.

    • salt.utils.check_include_exclude.Please use salt.utils.stringutils.check_include_exclude() instead.

    • salt.utils.print_cli.Please use salt.utils.stringutils.print_cli() instead.

    • salt.utils.clean_kwargs.Please use salt.utils.args.clean_kwargs() instead.

    • salt.utils.invalid_kwargs.Please use salt.utils.args.invalid_kwargs() instead.

    • salt.utils.shlex_split.Please use salt.utils.args.shlex_split() instead.

    • salt.utils.arg_lookup.Please use salt.utils.args.arg_lookup() instead.

    • salt.utils.argspec_report.Please use salt.utils.args.argspec_report() instead.

    • salt.utils.split_input.Please use salt.utils.args.split_input() instead.

    • salt.utils.test_mode.Please use salt.utils.args.test_mode() instead.

    • salt.utils.format_call.Please use salt.utils.args.format_call() instead.

    • salt.utils.which.Please use salt.utils.path.which() instead.

    • salt.utils.which_bin.Please use salt.utils.path.which_bin() instead.

    • salt.utils.path_join.Please use salt.utils.path.join() instead.

    • salt.utils.check_or_die.Please use salt.utils.path.check_or_die() instead.

    • salt.utils.sanitize_win_path_string.Please use salt.utils.path.sanitize_win_path() instead.

    • salt.utils.rand_str.Please use salt.utils.hashutils.random_hash() instead.

    • salt.utils.get_hash.Please use salt.utils.hashutils.get_hash() instead.

    • salt.utils.is_windows.Please use salt.utils.platform.is_windows() instead.

    • salt.utils.is_proxy.Please use salt.utils.platform.is_proxy() instead.

    • salt.utils.is_linux.Please use salt.utils.platform.is_linux() instead.

    • salt.utils.is_darwin.Please use salt.utils.platform.is_darwin() instead.

    • salt.utils.is_sunos.Please use salt.utils.platform.is_sunos() instead.

    • salt.utils.is_smartos.Please use salt.utils.platform.is_smartos() instead.

    • salt.utils.is_smartos_globalzone.Please use salt.utils.platform.is_smartos_globalzone() instead.

    • salt.utils.is_smartos_zone.Please use salt.utils.platform.is_smartos_zone() instead.

    • salt.utils.is_freebsd.Please use salt.utils.platform.is_freebsd() instead.

    • salt.utils.is_netbsd.Please use salt.utils.platform.is_netbsd() instead.

    • salt.utils.is_openbsd.Please use salt.utils.platform.is_openbsd() instead.

    • salt.utils.is_aix.Please use salt.utils.platform.is_aix() instead.

    • salt.utils.safe_rm.Please use salt.utils.files.safe_rm() instead.

    • salt.utils.is_empty.Please use salt.utils.files.is_empty() instead.

    • salt.utils.fopen.Please use salt.utils.files.fopen() instead.

    • salt.utils.flopen.Please use salt.utils.files.flopen() instead.

    • salt.utils.fpopen.Please use salt.utils.files.fpopen() instead.

    • salt.utils.rm_rf.Please use salt.utils.files.rm_rf() instead.

    • salt.utils.mkstemp.Please use salt.utils.files.mkstemp() instead.

    • salt.utils.istextfile.Please use salt.utils.files.is_text_file() instead.

    • salt.utils.is_bin_file.Please use salt.utils.files.is_binary() instead.

    • salt.utils.list_files.Please use salt.utils.files.list_files() instead.

    • salt.utils.safe_walk.Please use salt.utils.files.safe_walk() instead.

    • salt.utils.st_mode_to_octal.Please use salt.utils.files.st_mode_to_octal() instead.

    • salt.utils.normalize_mode.Please use salt.utils.files.normalize_mode() instead.

    • salt.utils.human_size_to_bytes.Please use salt.utils.files.human_size_to_bytes() instead.

    • salt.utils.backup_minion.Please use salt.utils.files.backup_minion() instead.

    • salt.utils.str_version_to_evr.Please use salt.utils.pkg.rpm.version_to_evr() instead.

    • salt.utils.parse_docstring.Please use salt.utils.doc.parse_docstring() instead.

    • salt.utils.compare_versions.Please use salt.utils.versions.compare() instead.

    • salt.utils.version_cmp.Please use salt.utils.versions.version_cmp() instead.

    • salt.utils.warn_until.Please use salt.utils.versions.warn_until() instead.

    • salt.utils.kwargs_warn_until.Please use salt.utils.versions.kwargs_warn_until() instead.

    • salt.utils.get_color_theme.Please use salt.utils.color.get_color_theme() instead.

    • salt.utils.get_colors.Please use salt.utils.color.get_colors() instead.

    • salt.utils.gen_state_tag.Please use salt.utils.state.gen_tag() instead.

    • salt.utils.search_onfail_requisites.Please use salt.utils.state.search_onfail_requisites() instead.

    • salt.utils.check_onfail_requisites.Please use salt.utils.state.check_onfail_requisites() instead.

    • salt.utils.check_state_result.Please use salt.utils.state.check_result() instead.

    • salt.utils.get_user.Please use salt.utils.user.get_user() instead.

    • salt.utils.get_uid.Please use salt.utils.user.get_uid() instead.

    • salt.utils.get_specific_user.Please use salt.utils.user.get_specific_user() instead.

    • salt.utils.chugid.Please use salt.utils.user.chugid() instead.

    • salt.utils.chugid_and_umask.Please use salt.utils.user.chugid_and_umask() instead.

    • salt.utils.get_default_group.Please use salt.utils.user.get_default_group() instead.

    • salt.utils.get_group_list.Please use salt.utils.user.get_group_list() instead.

    • salt.utils.get_group_dict.Please use salt.utils.user.get_group_dict() instead.

    • salt.utils.get_gid_list.Please use salt.utils.user.get_gid_list() instead.

    • salt.utils.get_gid.Please use salt.utils.user.get_gid() instead.

    • salt.utils.enable_ctrl_logoff_handler.Please use salt.utils.win_functions.enable_ctrl_logoff_handler() instead.

    • salt.utils.traverse_dict.Please use salt.utils.data.traverse_dict() instead.

    • salt.utils.traverse_dict_and_list.Please use salt.utils.data.traverse_dict_and_list() instead.

    • salt.utils.filter_by.Please use salt.utils.data.filter_by() instead.

    • salt.utils.subdict_match.Please use salt.utils.data.subdict_match() instead.

    • salt.utils.substr_in_list.Please use salt.utils.data.substr_in_list() instead.

    • salt.utils.is_dictlist.Please use salt.utils.data.is_dictlist() instead.

    • salt.utils.repack_dictlist.Please use salt.utils.data.repack_dictlist() instead.

    • salt.utils.compare_dicts.Please use salt.utils.data.compare_dicts() instead.

    • salt.utils.compare_lists.Please use salt.utils.data.compare_lists() instead.

    • salt.utils.decode_dict.Please use salt.utils.data.encode_dict() instead.

    • salt.utils.decode_list.Please use salt.utils.data.encode_list() instead.

    • salt.utils.exactly_n.Please use salt.utils.data.exactly_n() instead.

    • salt.utils.exactly_one.Please use salt.utils.data.exactly_one() instead.

    • salt.utils.is_list.Please use salt.utils.data.is_list() instead.

    • salt.utils.is_iter.Please use salt.utils.data.is_iter() instead.

    • salt.utils.isorted.Please use salt.utils.data.sorted_ignorecase() instead.

    • salt.utils.is_true.Please use salt.utils.data.is_true() instead.

    • salt.utils.mysql_to_dict.Please use salt.utils.data.mysql_to_dict() instead.

    • salt.utils.simple_types_filter.Please use salt.utils.data.simple_types_filter() instead.

    • salt.utils.ip_bracket.Please use salt.utils.zeromq.ip_bracket() instead.

    • salt.utils.gen_mac.Please use salt.utils.network.gen_mac() instead.

    • salt.utils.mac_str_to_bytes.Please use salt.utils.network.mac_str_to_bytes() instead.

    • salt.utils.refresh_dns.Please use salt.utils.network.refresh_dns() instead.

    • salt.utils.dns_check.Please use salt.utils.network.dns_check() instead.

    • salt.utils.get_context.Please use salt.utils.stringutils.get_context() instead.

    • salt.utils.get_master_key.Please use salt.utils.master.get_master_key() instead.

    • salt.utils.get_values_of_matching_keys.Please use salt.utils.master.get_values_of_matching_keys() instead.

    • salt.utils.date_cast.Please use salt.utils.dateutils.date_cast() instead.

    • salt.utils.date_format.Please use salt.utils.dateutils.strftime() instead.

    • salt.utils.total_seconds.Please use salt.utils.dateutils.total_seconds() instead.

    • salt.utils.find_json.Please use salt.utils.json.find_json() instead.

    • salt.utils.import_json.Please use salt.utils.json.import_json() instead.

    • salt.utils.namespaced_function.Please use salt.utils.functools.namespaced_function() instead.

    • salt.utils.alias_function.Please use salt.utils.functools.alias_function() instead.

    • salt.utils.profile_func.Please use salt.utils.profile.profile_func() instead.

    • salt.utils.activate_profile.Please use salt.utils.profile.activate_profile() instead.

    • salt.utils.output_profile.Please use 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.