mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
[develop] Merge forward from 2016.3 to develop (#33193)
* Add run_on_start docs to schedule.rst (#32958) Fixes #22580 * Backport #33021 manually to 2015.5 (#33044) * Saltfile with pillar tests (#33045) * add file.managed with pillar data tests * do not require git for other tests * Fix minor document error of test.assertion (#33067) * test pillar.items output (#33060) * File and User test fixes for 2015.5 on Fedora23 (#33055) * Fix file_test.test_symlink on 2015.5 * Fix failing user present test * add test for installing package while using salt-call --local (#33025) * add test for installing package while using salt-call --local * fix pylint * ssh docs: install py-2.6 for RHEL 5 * Bugfix: Restore boolean values from the repo configuration * Add test data for repos * Add repo config test * Bugfix (follow-up): setting priority requires non-positive integer * modules.npm: do not log npm --version at info level (#33084) * salt-cloud: fix ipv6-only virtual machines (#32865) * salt-cloud: fix ipv6-only virtual machines * fix hostname for rsync fallback in scp_file function * use 4 spaces instead of 2 * remove global variable, use direct socket call instead * Use saltstack repo in buildpackage.py on CentOS 5 (#33080) * Lower display of msgpack failure msg to debug (#33078) Closes #33074 * cloud.query needs to define mapper.opts (#33098) * clarify docs that map is designed to be run once. is not stateful (#33102) * Moved _finger_fail method to parent class. Method _finger_fail method from SAuth to AsyncAuth class to make method available in both class and fix an issue where _finger_Fail is called inside AsyncAuth. * Fix 33058 (#33099) * Fix servermanager module - Added check for 2008 version of windows - Added Import-Module ServerManager to _pshell_json. Apparently this needs to run each time we issue a servermanager command. * Fix list_available * salt.utils.gitfs: fix formatting for warning messages (#33064) * salt.utils.gitfs: fix formatting for warning messages When git_pillar support was added to salt.utils.gitfs, the recommendation globals had string formatting placeholders added to them, but the locations where these values are referenced do not call ``.format()`` to properly replace them. This commit fixes that oversight. * Remove more gitfs and master-specific wording from log messages * Add a check that the cmdline of the found proc matches (#33129) * Doc mock decorators (#33132) * Add mock function for mocking decorators * Mock the stdlib user module because importing it will open the repl * Fix broken parsing of usermgmt.conf on OpenBSD (#33135) When creating a new user, if a group of the same name already exists, the usermgmt.conf file is consulted to determine the primary group. It's in these cases that the parsing bug is triggered. This code change addresses several of the existing issues: - The previous split statement explicitly specified a single space. Since a config line may have any number of spaces and/or tabs surrounding the entries, the resulting array's elements may be incorrect. - According to the man pages for usermgmt.conf, the "group" config entry accpets a single parameter -- so we shouldn't iterate. - The "val[1]" was returning the 2nd letter of each word and not the second word on the config line as intended. * Move salt-ssh thin dir location to /var/tmp (#33130) * Move salt-ssh thin dir location to /var/tmp Closes #32771 * Remove performance penelty language * If cache_jobs: True is set, populate the local job cache when running salt-call (#33100) * If cache_jobs: True is set, populate the local job cache Fixes #32834 Allows a masterless minion to query the job cache. * Refactor cache_jobs functionality to be DRY * Skipping salt-call --local test * Back-port #31769 to 2015.8 (#33139) * Handle empty acl_name in linux_acl state Calls to setfacl interpret an empty group or user name to mean to be the owner of the file they're operating on. For example, for a directory owned by group 'admin', the ACL 'default:group::rwx' is equivalent to 'default:group:admin:rwx'. The output of the getfacl execution module returns ACLs in the format of 'group:admin:rwx' instead of 'group::rwx'. This commit changes the acl.present state to look for the owner of the file if the acl_name paremeter is empty. * Fix acl.present/acl.absent changing default ACLs The behaviour of the acl.present and acl.absent is to check the data structure returned by getfacl contains a key by the name of acl_type. However, this data structure does not contain any default ACLs if none exist, so this check will fail. We omit the check if a default ACL was passed into the state functions. Unfortunately, the call to modfacl may fail if the user passes in an acl_type such as 'default:random'. In this case the state will appear to succeed, but do nothing. This fixes the state module to allow setting default ACLs on files which have none. * Fix regression in 2016.3 HEAD when version is specified (#33146) Resolves #33013. * Hash fileclients by opts (#33142) * Hash fileclients by opts There was an issue whereby the cache of the fileclient was being overwritten by dueling minion instances in multimaster mode. This protects them by hashing by the id of opts. Closes #25040 * Silly typo! * Remove tests which do not test any actual functionality or are too tightly coupled to the implementation * Strip ldap fqdn (#33127) * Add option to strip off domain names on computer names that come from LDAP/AD * Add strip_domains option for ldap. * Add documentation for auth.ldap.minion_stripdomains. * [2015.5] Update to latest bootstrap script v2016.05.10 (#33155) * [2015.8] Update to latest bootstrap script v2016.05.10 (#33156) * [2016.3] Update to latest bootstrap script v2016.05.10 (#33157) * add 2015.5.11 release notes (#33160) * add 2015.8.9 release notes (#33161) * Pip fix (#33180) * fix pip!! * make it work with old pip as well * Added resiliency * Don't need to check, just get the right name * [2015.5] Update to latest bootstrap script v2016.05.11 (#33185)
This commit is contained in:
parent
b28b507c4a
commit
457d9dd4f5
33 changed files with 1420 additions and 557 deletions
23
doc/conf.py
23
doc/conf.py
|
@ -42,6 +42,9 @@ class Mock(object):
|
|||
# pylint: enable=R0903
|
||||
|
||||
MOCK_MODULES = [
|
||||
# Python stdlib
|
||||
'user',
|
||||
|
||||
# salt core
|
||||
'Crypto',
|
||||
'Crypto.Signature',
|
||||
|
@ -145,12 +148,32 @@ MOCK_MODULES = [
|
|||
for mod_name in MOCK_MODULES:
|
||||
sys.modules[mod_name] = Mock()
|
||||
|
||||
def mock_decorator_with_params(*oargs, **okwargs):
|
||||
'''
|
||||
Optionally mock a decorator that takes parameters
|
||||
|
||||
E.g.:
|
||||
|
||||
@blah(stuff=True)
|
||||
def things():
|
||||
pass
|
||||
'''
|
||||
def inner(fn, *iargs, **ikwargs):
|
||||
if hasattr(fn, '__call__'):
|
||||
return fn
|
||||
else:
|
||||
return Mock()
|
||||
return inner
|
||||
|
||||
# Define a fake version attribute for the following libs.
|
||||
sys.modules['libcloud'].__version__ = '0.0.0'
|
||||
sys.modules['pymongo'].version = '0.0.0'
|
||||
sys.modules['ntsecuritycon'].STANDARD_RIGHTS_REQUIRED = 0
|
||||
sys.modules['ntsecuritycon'].SYNCHRONIZE = 0
|
||||
|
||||
# Define a fake version attribute for the following libs.
|
||||
sys.modules['cherrypy'].config = mock_decorator_with_params
|
||||
|
||||
|
||||
# -- Add paths to PYTHONPATH ---------------------------------------------------
|
||||
try:
|
||||
|
|
|
@ -7,7 +7,8 @@ Cloud Map File
|
|||
A number of options exist when creating virtual machines. They can be managed
|
||||
directly from profiles and the command line execution, or a more complex map
|
||||
file can be created. The map file allows for a number of virtual machines to
|
||||
be created and associated with specific profiles.
|
||||
be created and associated with specific profiles. The map file is designed to
|
||||
be run once to create these more complex scenarios using salt-cloud.
|
||||
|
||||
Map files have a simple format, specify a profile and then a list of virtual
|
||||
machines to make from said profile:
|
||||
|
|
|
@ -172,6 +172,8 @@ Server configuration values and their defaults:
|
|||
auth.ldap.activedirectory: False
|
||||
auth.ldap.persontype: 'person'
|
||||
|
||||
auth.ldap.minion_stripdomains: []
|
||||
|
||||
There are two phases to LDAP authentication. First, Salt authenticates to search for a users' Distinguished Name
|
||||
and group membership. The user it authenticates as in this phase is often a special LDAP system user with
|
||||
read-only access to the LDAP directory. After Salt searches the directory to determine the actual user's DN
|
||||
|
@ -211,6 +213,16 @@ the results are filtered against ``auth.ldap.groupclass``, default
|
|||
|
||||
auth.ldap.groupou: Groups
|
||||
|
||||
When using the `ldap('DC=domain,DC=com')` eauth operator, sometimes the records returned
|
||||
from LDAP or Active Directory have fully-qualified domain names attached, while minion IDs
|
||||
instead are simple hostnames. The parameter below allows the administrator to strip
|
||||
off a certain set of domain names so the hostnames looked up in the directory service
|
||||
can match the minion IDs.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
auth.ldap.minion_stripdomains: ['.external.bigcorp.com', '.internal.bigcorp.com']
|
||||
|
||||
Active Directory
|
||||
----------------
|
||||
|
||||
|
@ -265,3 +277,17 @@ To configure a LDAP group, append a ``%`` to the ID:
|
|||
test_ldap_group%:
|
||||
- '*':
|
||||
- test.echo
|
||||
|
||||
In addition, if there are a set of computers in the directory service that should
|
||||
be part of the eAuth definition, they can be specified like this:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
external_auth:
|
||||
ldap:
|
||||
test_ldap_group%:
|
||||
- ldap('DC=corp,DC=example,DC=com'):
|
||||
- test.echo
|
||||
|
||||
The string inside `ldap()` above is any valid LDAP/AD tree limiter. `OU=` in
|
||||
particular is permitted as long as it would return a list of computer objects.
|
||||
|
|
|
@ -1,6 +1,392 @@
|
|||
==========================================
|
||||
Salt 2015.5.11 Release Notes (In Progress)
|
||||
==========================================
|
||||
============================
|
||||
Salt 2015.5.11 Release Notes
|
||||
============================
|
||||
|
||||
In progress, not yet released.
|
||||
Version 2015.5.6 is a bugfix release for :doc:`2015.5.0
|
||||
</topics/releases/2015.5.0>`.
|
||||
|
||||
Changes for v2015.5.10..v2015.5.11
|
||||
----------------------------------
|
||||
|
||||
Extended changelog courtesy of Todd Stansell (https://github.com/tjstansell/salt-changelogs):
|
||||
|
||||
*Generated at: 2016-05-11T00:06:35Z*
|
||||
|
||||
Total Merges: **98**
|
||||
|
||||
Changes:
|
||||
|
||||
* e0da8fd [2015.5] Update to latest bootstrap script v2016.05.10 (`#33155`_)
|
||||
|
||||
- **PR** `#33141`_: (*jtand*) Skipping salt-call --local test
|
||||
|
||||
* 878d34a Doc mock decorators (`#33132`_)
|
||||
|
||||
* 30edead Lower display of msgpack failure msg to debug (`#33078`_)
|
||||
|
||||
* d4928c5 Use saltstack repo in buildpackage.py on CentOS 5 (`#33080`_)
|
||||
|
||||
* 61d126c add test for installing package while using salt-call --local (`#33025`_)
|
||||
|
||||
* 6d3e4e8 File and User test fixes for 2015.5 on Fedora23 (`#33055`_)
|
||||
|
||||
* d48b2b8 test pillar.items output (`#33060`_)
|
||||
|
||||
* 398793b Fix minor document error of test.assertion (`#33067`_)
|
||||
|
||||
* f875763 Saltfile with pillar tests (`#33045`_)
|
||||
|
||||
* 1d78924 Backport `#33021`_ manually to 2015.5 (`#33044`_)
|
||||
|
||||
* f00b5f9 Add run_on_start docs to schedule.rst (`#32958`_)
|
||||
|
||||
* edce22a backport PR `#32732`_ to 2015.5 fixes `#23714`_ (`#32848`_)
|
||||
|
||||
* 9b5c14c `salt-cloud -u` downloads stable version from bootstrap.saltstack.com by default (`#32837`_)
|
||||
|
||||
* 9725804 update bootstrap to 2016.04.18 release (`#32667`_)
|
||||
|
||||
- **PR** `#32776`_: (*rallytime*) [2015.5] Merge forward from 2014.7 to 2015.5
|
||||
|
||||
* 67d0c81 Support remote sources in a source list (`#32691`_)
|
||||
|
||||
- **PR** `#32686`_: (*cachedout*) Fix stacktrace in batch with dup minion ids
|
||||
|
||||
* 3ec9502 Update "Low Hanging Fruit" to "Help Wanted" (`#32675`_)
|
||||
|
||||
* 77bea56 Additional documentation on calling exec modules from templates (`#32657`_)
|
||||
|
||||
* c910b8d Fixing critical bug to remove only the specified Host instead of the entire Host cluster (`#32639`_)
|
||||
|
||||
* 4568565 Add _syspaths.py to .gitignore (`#32638`_)
|
||||
|
||||
- **PR** `#32561`_: (*gtmanfred*) redact passwords and hashes from user.present updates
|
||||
|
||||
- **PR** `#32538`_: (*rallytime*) Back-port `#32528`_ to 2015.5
|
||||
|
||||
* 29333e5 Add documentation for some master/minion configs (`#32454`_)
|
||||
|
||||
- **PR** `#32458`_: (*terminalmage*) Improve and clarify docs on provider overrides.
|
||||
|
||||
* 0809126 Merge `#32293`_ with test fixes (`#32418`_)
|
||||
|
||||
* bbd8260 Ignore Raspbian in service.py __virtual__ (`#32421`_)
|
||||
|
||||
* 690addf FreeBSD supports packages in format java/openjdk7 so the prior commit broke that functionality. Check freebsd/pkg`#1409`_ for more info.
|
||||
|
||||
- **PR** `#32399`_: (*amontalban*) Backport to fix `#28262`_ for 2015.5 as requested in PR `#32376`_
|
||||
|
||||
- **PR** `#32374`_: (*cachedout*) Update proxmox documentation
|
||||
|
||||
- **PR** `#32339`_: (*Ch3LL*) remove reference to master_alive_check in 2015.5
|
||||
|
||||
- **PR** `#32284`_: (*rallytime*) Audit config.py default types and values
|
||||
|
||||
- **PR** `#32302`_: (*terminalmage*) Properly support packages with blank "Release" param in pkg.latest_version
|
||||
|
||||
- **PR** `#32162`_: (*terminalmage*) Properly handle yum/zypper repositories in pkgrepo.managed
|
||||
|
||||
- **PR** `#32223`_: (*twangboy*) Create minion.d directory on install for Windows
|
||||
|
||||
- **PR** `#32218`_: (*cachedout*) Only display error when tty is True in salt-ssh
|
||||
|
||||
- **PR** `#32196`_: (*jtand*) Fixed pylint error in app_pam_test.py
|
||||
|
||||
- **PR** `#32154`_: (*Ch3LL*) Add integration tests for salt-api using pam eauth
|
||||
|
||||
- **PR** `#32170`_: (*gtmanfred*) add name for lxc for use with cloud cache
|
||||
|
||||
- **PR** `#32164`_: (*terminalmage*) Make __virtual__ for rhservice.py more robust (2015.5 branch)
|
||||
|
||||
- **PR** `#32141`_: (*paclat*) fixes 32108
|
||||
|
||||
- **PR** `#32129`_: (*terminalmage*) Support multiple valid option types when performing type checks
|
||||
|
||||
- **PR** `#32056`_: (*bstevenson*) Fix list absent
|
||||
|
||||
- **PR** `#32096`_: (*rallytime*) Back-port `#32065`_ to 2015.5
|
||||
|
||||
- **PR** `#32104`_: (*jacobhammons*) One additional known issue for 2015.5.10 release notes
|
||||
|
||||
- **PR** `#32100`_: (*jacobhammons*) 2015.5.10 release docs
|
||||
|
||||
- **PR** `#32038`_: (*terminalmage*) Improve state module docs, replace references to state.highstate/state.sls with state.apply
|
||||
|
||||
- **PR** `#32051`_: (*terminalmage*) Fix outputter for state.apply
|
||||
|
||||
- **PR** `#32002`_: (*abednarik*) Added Manajro Linux to virtual.
|
||||
|
||||
- **PR** `#31957`_: (*rallytime*) [2015.5] Merge forward from 2014.7 to 2015.5
|
||||
|
||||
- **PR** `#31972`_: (*terminalmage*) Make lack of python-ldap module more explicit when LDAP eauth is enabled
|
||||
|
||||
- **PR** `#31935`_: (*twangboy*) Back port nullsoft build script from 2015.8
|
||||
|
||||
- **PR** `#31912`_: (*jfindlay*) log.mixins: remove extermporaneous .record
|
||||
|
||||
- **PR** `#31825`_: (*jtand*) Updated .testing.pylintrc to match newer versions of pylint
|
||||
|
||||
- **PR** `#31900`_: (*rallytime*) Add "python module" clarification to ps __virtual__ warning.
|
||||
|
||||
- **PR** `#31878`_: (*rallytime*) Make sure __virtual__ error message is helpful when psutil is missing
|
||||
|
||||
- **PR** `#31852`_: (*rallytime*) [2015.5] Merge forward from 2014.7 to 2015.5
|
||||
|
||||
- **PR** `#31827`_: (*gtmanfred*) Remove ability of authenticating user to specify pam service
|
||||
|
||||
- **PR** `#31810`_: (*whiteinge*) Fix outdated Jinja 'env' variable reference
|
||||
|
||||
- **PR** `#31744`_: (*brejoc*) Fix for AttributeError with libcloud <0.15
|
||||
|
||||
- **PR** `#31740`_: (*terminalmage*) Assume pillar_opts is False when not specified in masterless mode
|
||||
|
||||
- **PR** `#31750`_: (*rallytime*) Back-port `#26170`_ to 2015.5
|
||||
|
||||
- **PR** `#31689`_: (*rallytime*) Back-port `#29467`_ to 2015.5
|
||||
|
||||
- **PR** `#31687`_: (*cachedout*) Removed useless GPG tests
|
||||
|
||||
- **PR** `#31660`_: (*terminalmage*) Remove epoch from version string if present when installing with yum
|
||||
|
||||
- **PR** `#31683`_: (*rallytime*) Back-port `#31578`_ to 2015.5
|
||||
|
||||
- **PR** `#31682`_: (*cachedout*) Add definition of job cache to glossary
|
||||
|
||||
- **PR** `#31658`_: (*rallytime*) Add mentioned of Salt's Coding Style docs to the Contributing docs
|
||||
|
||||
- **PR** `#31655`_: (*rallytime*) Make note of pylint dependencies in docs
|
||||
|
||||
- **PR** `#31440`_: (*cachedout*) Set correct type for master_tops config value
|
||||
|
||||
- **PR** `#31622`_: (*jfindlay*) doc/topics/tutorials/http: update query decoding docs
|
||||
|
||||
- **PR** `#31558`_: (*cachedout*) Don't stacktrace if ssh binary is not installed with salt-ssh
|
||||
|
||||
- **PR** `#31521`_: (*terminalmage*) salt-ssh: Fix race condition when caching files to build the thin tarball
|
||||
|
||||
- **PR** `#31497`_: (*rallytime*) Remove duplicate "timeout" definition in Roster docs
|
||||
|
||||
- **PR** `#31472`_: (*rallytime*) Update contributing docs
|
||||
|
||||
- **PR** `#31461`_: (*DmitryKuzmenko*) Set auth retry count to 0 if multimaster mode is failover.
|
||||
|
||||
- **PR** `#31442`_: (*sastorsl*) Add os.path.exists(src) to file.py, def copy
|
||||
|
||||
- **PR** `#31441`_: (*cachedout*) Include localhost minions in presence detection for runner
|
||||
|
||||
- **PR** `#31416`_: (*carlwgeorge*) selinux module documentation fix
|
||||
|
||||
- **PR** `#31336`_: (*terminalmage*) Improve config validation logging
|
||||
|
||||
- **PR** `#31374`_: (*sjorge*) fix for `#31369`_
|
||||
|
||||
- **PR** `#31339`_: (*jacobhammons*) changed latest release to 2015.8.7
|
||||
|
||||
- **PR** `#31288`_: (*notpeter*) Improve salt.states.ssh_known_hosts documentation.
|
||||
|
||||
- **PR** `#31183`_: (*heyfife*) Fixed named external_ip reservation/re-use code in gce driver.
|
||||
|
||||
- **PR** `#31032`_: (*terminalmage*) (2015.5 branch) yumpkg: ensure that dnf-plugins-core >= 0.1.15 is installed
|
||||
|
||||
- **PR** `#31264`_: (*sjorge*) fix if_missing gets appended to dirs list, take III
|
||||
|
||||
- **PR** `#31110`_: (*cachedout*) Fixup 30730
|
||||
|
||||
- **PR** `#30974`_: (*rallytime*) Back-port `#30949`_ to 2015.5
|
||||
|
||||
- **PR** `#30942`_: (*rallytime*) Back-port `#30897`_ to 2015.5
|
||||
|
||||
- **PR** `#30922`_: (*jacobhammons*) Rev latest version to 2015.8.5
|
||||
|
||||
- **PR** `#30865`_: (*abednarik*) Better boto elb error message.
|
||||
|
||||
- **PR** `#30831`_: (*jacobhammons*) Updated readme
|
||||
|
||||
- **PR** `#30829`_: (*jacobhammons*) Updated latest version to 2015.8.4
|
||||
|
||||
- **PR** `#30784`_: (*rallytime*) Back-port `#24952`_ to 2015.5
|
||||
|
||||
- **PR** `#30764`_: (*terminalmage*) Work around yum versionlock's inability to remove holds by package name alone
|
||||
|
||||
- **PR** `#30760`_: (*toanju*) Changed output format of arp_ip_target from list to comma delimited...
|
||||
|
||||
- **PR** `#30757`_: (*yannis666*) Fix to mine update to merge configuration
|
||||
|
||||
- **PR** `#30749`_: (*abednarik*) Fix Netwotk hostname Module in Debian systems.
|
||||
|
||||
- **PR** `#30699`_: (*abednarik*) Add Retry to save_load.
|
||||
|
||||
- **PR** `#30659`_: (*sjmh*) Fix lsscsi issues for certain platforms
|
||||
|
||||
- **PR** `#30671`_: (*techhat*) Add file locking to cloud index
|
||||
|
||||
- **PR** `#30586`_: (*abednarik*) Fix comment_line permissions.
|
||||
|
||||
- **PR** `#30582`_: (*terminalmage*) yumpkg.check_db: run separate repoquery commands when multiple names passed
|
||||
|
||||
- **PR** `#30548`_: (*jacobhammons*) Added placeholder release notes for 2015.5.10
|
||||
|
||||
- **PR** `#30530`_: (*terminalmage*) 2015.5 tweaks from `#30529`_
|
||||
|
||||
- **PR** `#30484`_: (*terminalmage*) Backport DNF support to 2015.5 branch
|
||||
|
||||
- **PR** `#30512`_: (*jfindlay*) disable pkgrepo test for ubuntu 15.10+
|
||||
|
||||
- **PR** `#30478`_: (*jtand*) Updated pip_state to work with pip 8.0
|
||||
|
||||
- **PR** `#30482`_: (*borgstrom*) Pyobjects recursive import support (for 2015.5)
|
||||
|
||||
- **PR** `#30459`_: (*jfindlay*) modules.pkg: disable repo int test for ubuntu 15.10
|
||||
|
||||
- **PR** `#30443`_: (*jtand*) Boto uses False for is_default instead of None
|
||||
|
||||
- **PR** `#30420`_: (*attiasr*) Backport `#26853`_
|
||||
|
||||
- **PR** `#30364`_: (*rallytime*) Add TLS version imports and add linode driver documentation notices
|
||||
|
||||
- **PR** `#30184`_: (*rallytime*) Back-port `#30166`_ to 2015.5
|
||||
|
||||
- **PR** `#30291`_: (*thegoodduke*) ipset: fix test=true & add comment for every entry
|
||||
|
||||
.. _`#24952`: https://github.com/saltstack/salt/pull/24952
|
||||
.. _`#26170`: https://github.com/saltstack/salt/pull/26170
|
||||
.. _`#26853`: https://github.com/saltstack/salt/pull/26853
|
||||
.. _`#27952`: https://github.com/saltstack/salt/pull/27952
|
||||
.. _`#29467`: https://github.com/saltstack/salt/pull/29467
|
||||
.. _`#30166`: https://github.com/saltstack/salt/pull/30166
|
||||
.. _`#30170`: https://github.com/saltstack/salt/pull/30170
|
||||
.. _`#30184`: https://github.com/saltstack/salt/pull/30184
|
||||
.. _`#30291`: https://github.com/saltstack/salt/pull/30291
|
||||
.. _`#30364`: https://github.com/saltstack/salt/pull/30364
|
||||
.. _`#30420`: https://github.com/saltstack/salt/pull/30420
|
||||
.. _`#30443`: https://github.com/saltstack/salt/pull/30443
|
||||
.. _`#30459`: https://github.com/saltstack/salt/pull/30459
|
||||
.. _`#30478`: https://github.com/saltstack/salt/pull/30478
|
||||
.. _`#30482`: https://github.com/saltstack/salt/pull/30482
|
||||
.. _`#30484`: https://github.com/saltstack/salt/pull/30484
|
||||
.. _`#30512`: https://github.com/saltstack/salt/pull/30512
|
||||
.. _`#30529`: https://github.com/saltstack/salt/pull/30529
|
||||
.. _`#30530`: https://github.com/saltstack/salt/pull/30530
|
||||
.. _`#30548`: https://github.com/saltstack/salt/pull/30548
|
||||
.. _`#30582`: https://github.com/saltstack/salt/pull/30582
|
||||
.. _`#30586`: https://github.com/saltstack/salt/pull/30586
|
||||
.. _`#30659`: https://github.com/saltstack/salt/pull/30659
|
||||
.. _`#30671`: https://github.com/saltstack/salt/pull/30671
|
||||
.. _`#30699`: https://github.com/saltstack/salt/pull/30699
|
||||
.. _`#30749`: https://github.com/saltstack/salt/pull/30749
|
||||
.. _`#30757`: https://github.com/saltstack/salt/pull/30757
|
||||
.. _`#30760`: https://github.com/saltstack/salt/pull/30760
|
||||
.. _`#30764`: https://github.com/saltstack/salt/pull/30764
|
||||
.. _`#30784`: https://github.com/saltstack/salt/pull/30784
|
||||
.. _`#30829`: https://github.com/saltstack/salt/pull/30829
|
||||
.. _`#30831`: https://github.com/saltstack/salt/pull/30831
|
||||
.. _`#30865`: https://github.com/saltstack/salt/pull/30865
|
||||
.. _`#30897`: https://github.com/saltstack/salt/pull/30897
|
||||
.. _`#30922`: https://github.com/saltstack/salt/pull/30922
|
||||
.. _`#30942`: https://github.com/saltstack/salt/pull/30942
|
||||
.. _`#30949`: https://github.com/saltstack/salt/pull/30949
|
||||
.. _`#30974`: https://github.com/saltstack/salt/pull/30974
|
||||
.. _`#31032`: https://github.com/saltstack/salt/pull/31032
|
||||
.. _`#31110`: https://github.com/saltstack/salt/pull/31110
|
||||
.. _`#31176`: https://github.com/saltstack/salt/pull/31176
|
||||
.. _`#31183`: https://github.com/saltstack/salt/pull/31183
|
||||
.. _`#31250`: https://github.com/saltstack/salt/pull/31250
|
||||
.. _`#31264`: https://github.com/saltstack/salt/pull/31264
|
||||
.. _`#31288`: https://github.com/saltstack/salt/pull/31288
|
||||
.. _`#31336`: https://github.com/saltstack/salt/pull/31336
|
||||
.. _`#31339`: https://github.com/saltstack/salt/pull/31339
|
||||
.. _`#31374`: https://github.com/saltstack/salt/pull/31374
|
||||
.. _`#31382`: https://github.com/saltstack/salt/pull/31382
|
||||
.. _`#31416`: https://github.com/saltstack/salt/pull/31416
|
||||
.. _`#31440`: https://github.com/saltstack/salt/pull/31440
|
||||
.. _`#31441`: https://github.com/saltstack/salt/pull/31441
|
||||
.. _`#31442`: https://github.com/saltstack/salt/pull/31442
|
||||
.. _`#31461`: https://github.com/saltstack/salt/pull/31461
|
||||
.. _`#31472`: https://github.com/saltstack/salt/pull/31472
|
||||
.. _`#31497`: https://github.com/saltstack/salt/pull/31497
|
||||
.. _`#31521`: https://github.com/saltstack/salt/pull/31521
|
||||
.. _`#31558`: https://github.com/saltstack/salt/pull/31558
|
||||
.. _`#31578`: https://github.com/saltstack/salt/pull/31578
|
||||
.. _`#31622`: https://github.com/saltstack/salt/pull/31622
|
||||
.. _`#31655`: https://github.com/saltstack/salt/pull/31655
|
||||
.. _`#31658`: https://github.com/saltstack/salt/pull/31658
|
||||
.. _`#31660`: https://github.com/saltstack/salt/pull/31660
|
||||
.. _`#31682`: https://github.com/saltstack/salt/pull/31682
|
||||
.. _`#31683`: https://github.com/saltstack/salt/pull/31683
|
||||
.. _`#31687`: https://github.com/saltstack/salt/pull/31687
|
||||
.. _`#31689`: https://github.com/saltstack/salt/pull/31689
|
||||
.. _`#31740`: https://github.com/saltstack/salt/pull/31740
|
||||
.. _`#31744`: https://github.com/saltstack/salt/pull/31744
|
||||
.. _`#31750`: https://github.com/saltstack/salt/pull/31750
|
||||
.. _`#31810`: https://github.com/saltstack/salt/pull/31810
|
||||
.. _`#31825`: https://github.com/saltstack/salt/pull/31825
|
||||
.. _`#31826`: https://github.com/saltstack/salt/pull/31826
|
||||
.. _`#31827`: https://github.com/saltstack/salt/pull/31827
|
||||
.. _`#31833`: https://github.com/saltstack/salt/pull/31833
|
||||
.. _`#31834`: https://github.com/saltstack/salt/pull/31834
|
||||
.. _`#31852`: https://github.com/saltstack/salt/pull/31852
|
||||
.. _`#31878`: https://github.com/saltstack/salt/pull/31878
|
||||
.. _`#31900`: https://github.com/saltstack/salt/pull/31900
|
||||
.. _`#31912`: https://github.com/saltstack/salt/pull/31912
|
||||
.. _`#31929`: https://github.com/saltstack/salt/pull/31929
|
||||
.. _`#31935`: https://github.com/saltstack/salt/pull/31935
|
||||
.. _`#31957`: https://github.com/saltstack/salt/pull/31957
|
||||
.. _`#31972`: https://github.com/saltstack/salt/pull/31972
|
||||
.. _`#32002`: https://github.com/saltstack/salt/pull/32002
|
||||
.. _`#32038`: https://github.com/saltstack/salt/pull/32038
|
||||
.. _`#32051`: https://github.com/saltstack/salt/pull/32051
|
||||
.. _`#32056`: https://github.com/saltstack/salt/pull/32056
|
||||
.. _`#32065`: https://github.com/saltstack/salt/pull/32065
|
||||
.. _`#32096`: https://github.com/saltstack/salt/pull/32096
|
||||
.. _`#32100`: https://github.com/saltstack/salt/pull/32100
|
||||
.. _`#32104`: https://github.com/saltstack/salt/pull/32104
|
||||
.. _`#32129`: https://github.com/saltstack/salt/pull/32129
|
||||
.. _`#32141`: https://github.com/saltstack/salt/pull/32141
|
||||
.. _`#32154`: https://github.com/saltstack/salt/pull/32154
|
||||
.. _`#32162`: https://github.com/saltstack/salt/pull/32162
|
||||
.. _`#32164`: https://github.com/saltstack/salt/pull/32164
|
||||
.. _`#32165`: https://github.com/saltstack/salt/pull/32165
|
||||
.. _`#32170`: https://github.com/saltstack/salt/pull/32170
|
||||
.. _`#32196`: https://github.com/saltstack/salt/pull/32196
|
||||
.. _`#32218`: https://github.com/saltstack/salt/pull/32218
|
||||
.. _`#32223`: https://github.com/saltstack/salt/pull/32223
|
||||
.. _`#32284`: https://github.com/saltstack/salt/pull/32284
|
||||
.. _`#32293`: https://github.com/saltstack/salt/pull/32293
|
||||
.. _`#32302`: https://github.com/saltstack/salt/pull/32302
|
||||
.. _`#32339`: https://github.com/saltstack/salt/pull/32339
|
||||
.. _`#32374`: https://github.com/saltstack/salt/pull/32374
|
||||
.. _`#32376`: https://github.com/saltstack/salt/pull/32376
|
||||
.. _`#32399`: https://github.com/saltstack/salt/pull/32399
|
||||
.. _`#32418`: https://github.com/saltstack/salt/pull/32418
|
||||
.. _`#32421`: https://github.com/saltstack/salt/pull/32421
|
||||
.. _`#32454`: https://github.com/saltstack/salt/pull/32454
|
||||
.. _`#32458`: https://github.com/saltstack/salt/pull/32458
|
||||
.. _`#32528`: https://github.com/saltstack/salt/pull/32528
|
||||
.. _`#32538`: https://github.com/saltstack/salt/pull/32538
|
||||
.. _`#32552`: https://github.com/saltstack/salt/pull/32552
|
||||
.. _`#32561`: https://github.com/saltstack/salt/pull/32561
|
||||
.. _`#32590`: https://github.com/saltstack/salt/pull/32590
|
||||
.. _`#32638`: https://github.com/saltstack/salt/pull/32638
|
||||
.. _`#32639`: https://github.com/saltstack/salt/pull/32639
|
||||
.. _`#32657`: https://github.com/saltstack/salt/pull/32657
|
||||
.. _`#32667`: https://github.com/saltstack/salt/pull/32667
|
||||
.. _`#32675`: https://github.com/saltstack/salt/pull/32675
|
||||
.. _`#32686`: https://github.com/saltstack/salt/pull/32686
|
||||
.. _`#32691`: https://github.com/saltstack/salt/pull/32691
|
||||
.. _`#32732`: https://github.com/saltstack/salt/pull/32732
|
||||
.. _`#32776`: https://github.com/saltstack/salt/pull/32776
|
||||
.. _`#32837`: https://github.com/saltstack/salt/pull/32837
|
||||
.. _`#32848`: https://github.com/saltstack/salt/pull/32848
|
||||
.. _`#32958`: https://github.com/saltstack/salt/pull/32958
|
||||
.. _`#33021`: https://github.com/saltstack/salt/pull/33021
|
||||
.. _`#33025`: https://github.com/saltstack/salt/pull/33025
|
||||
.. _`#33044`: https://github.com/saltstack/salt/pull/33044
|
||||
.. _`#33045`: https://github.com/saltstack/salt/pull/33045
|
||||
.. _`#33055`: https://github.com/saltstack/salt/pull/33055
|
||||
.. _`#33060`: https://github.com/saltstack/salt/pull/33060
|
||||
.. _`#33067`: https://github.com/saltstack/salt/pull/33067
|
||||
.. _`#33078`: https://github.com/saltstack/salt/pull/33078
|
||||
.. _`#33080`: https://github.com/saltstack/salt/pull/33080
|
||||
.. _`#33132`: https://github.com/saltstack/salt/pull/33132
|
||||
.. _`#33141`: https://github.com/saltstack/salt/pull/33141
|
||||
.. _`#33155`: https://github.com/saltstack/salt/pull/33155
|
||||
|
|
|
@ -1,6 +1,683 @@
|
|||
=========================================
|
||||
Salt 2015.8.9 Release Notes (In Progress)
|
||||
=========================================
|
||||
===========================
|
||||
Salt 2015.8.9 Release Notes
|
||||
===========================
|
||||
|
||||
In progress, not yet released.
|
||||
Version 2015.8.9 is a bugfix release for :doc:`2015.8.0
|
||||
</topics/releases/2015.8.0>`.
|
||||
|
||||
Changes for v2015.8.8..v2015.8.9
|
||||
--------------------------------
|
||||
|
||||
Extended changelog courtesy of Todd Stansell (https://github.com/tjstansell/salt-changelogs):
|
||||
|
||||
*Generated at: 2016-05-11T00:31:08Z*
|
||||
|
||||
Total Merges: **139**
|
||||
|
||||
Changes:
|
||||
|
||||
* 2d9919e [2015.8] Update to latest bootstrap script v2016.05.10 (`#33156`_)
|
||||
|
||||
* 033bef2 Hash fileclients by opts (`#33142`_)
|
||||
|
||||
* f520fa3 Back-port `#31769`_ to 2015.8 (`#33139`_)
|
||||
|
||||
- **PR** `#33144`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
- **PR** `#33140`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
* ad607ef If cache_jobs: True is set, populate the local job cache when running salt-call (`#33100`_)
|
||||
|
||||
* 64689a6 Fix broken parsing of usermgmt.conf on OpenBSD (`#33135`_)
|
||||
|
||||
* 06a382e Add a check that the cmdline of the found proc matches (`#33129`_)
|
||||
|
||||
* 10018e9 salt.utils.gitfs: fix formatting for warning messages (`#33064`_)
|
||||
|
||||
* d45b599 Fix 33058 (`#33099`_)
|
||||
|
||||
- **PR** `#33106`_: (*abednarik*) Moved _finger_fail method to parent class.
|
||||
|
||||
* 20c7e10 clarify docs that map is designed to be run once. is not stateful (`#33102`_)
|
||||
|
||||
* 558561d cloud.query needs to define mapper.opts (`#33098`_)
|
||||
|
||||
- **PR** `#33096`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
* 22a327b salt-cloud: fix ipv6-only virtual machines (`#32865`_)
|
||||
|
||||
* e788f7e modules.npm: do not log npm --version at info level (`#33084`_)
|
||||
|
||||
- **PR** `#33081`_: (*jfindlay*) ssh docs: install py-2.6 for RHEL 5
|
||||
|
||||
- **PR** `#33088`_: (*isbm*) Bugfix: Restore boolean values from the repo configuration
|
||||
|
||||
* 2c6326f fix tests for file.blockplace to remove newline (`#33082`_)
|
||||
|
||||
- **PR** `#32892`_: (*isbm*) Resolve Zypper locks on asynchronous calls
|
||||
|
||||
* 3e0bf23 Add fun_args to scheduled return data (part of `#24237`_) (`#33039`_)
|
||||
|
||||
* 264c0d4 Don't append a newline when creating new content with blockreplace (`#33049`_)
|
||||
|
||||
* 54b783a Pass all data to batch.run() call when using --failhard (`#33048`_)
|
||||
|
||||
* 2dbfa55 Display command output when command fails with batch + failhard options (`#33050`_)
|
||||
|
||||
* add9199 Allow security_groups kwarg for boto_elb.present to be string or list (`#33053`_)
|
||||
|
||||
* 111701c [2015.8] Merge forward from 2015.5 to 2015.8 (`#33054`_)
|
||||
|
||||
* 1066063 File and User test fixes for 2015.8 on Fedora23 (`#33056`_)
|
||||
|
||||
* f97b5d5 Back-port `#33030`_ to 2015.8 (`#33040`_)
|
||||
|
||||
* e90a501 Update the docs for saltutil.find_job to be more clear/accurate (`#33017`_)
|
||||
|
||||
* d3d77ce Add saltenv to the cmd.script state function (`#33031`_)
|
||||
|
||||
* 3434f44 Fix syndic regression (`#33021`_)
|
||||
|
||||
* 4bb3ca5 Compare uid and gid instead of name and group (`#32674`_)
|
||||
|
||||
* 9ca5b02 Allow batch mode to use verbose option, as well as show_jid. (`#32996`_)
|
||||
|
||||
* 81c0fa4 Fixed glusterfs.peered output (`#32955`_)
|
||||
|
||||
* 8c70d7a Clarify some arg docs (`#32994`_)
|
||||
|
||||
* 00fbeab Fix boto_secgroup_test (`#32986`_)
|
||||
|
||||
* 3362367 fix user cron on solarish operating systems (`#32970`_)
|
||||
|
||||
* 07e38bc salt.log.setup: process user args before format (`#32796`_)
|
||||
|
||||
* b2d7c81 doc.ref.states.ordering: clarify requisite change (`#32934`_)
|
||||
|
||||
* df41d5d mode should default to 'text' (`#32928`_)
|
||||
|
||||
* f581a82 Remove FileClient class references from docs - it doesn't exist. (`#32925`_)
|
||||
|
||||
* 31b96de Update contents_grains option with relevant docs (`#32922`_)
|
||||
|
||||
- **PR** `#32926`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
* 1cd6a45 specify volume tags in profile configuration (`#32908`_)
|
||||
|
||||
* 85ca86d Update docs to warn users that -1 isn't valid for iptables insert state (`#32906`_)
|
||||
|
||||
* cb68706 Allow profile options to be specified in provider file when using maps (`#32900`_)
|
||||
|
||||
* 1a55fcb Clarify service state opening docs - uses 'service' virtualname (`#32880`_)
|
||||
|
||||
- **PR** `#32884`_: (*terminalmage*) Fix incorrect deprecation notice
|
||||
|
||||
- **PR** `#32878`_: (*jacobhammons*) added note about updating the bootstrap script in salt-cloud using th…
|
||||
|
||||
- **PR** `#32869`_: (*rallytime*) Use correct config setting in cloud syndic docs
|
||||
|
||||
- **PR** `#32844`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
* eb8fb6b Back-port `#31139`_ to 2015.8 (`#32868`_)
|
||||
|
||||
* 4bb5545 backport PR `#32732`_ for issue `#23714`_ (`#32847`_)
|
||||
|
||||
* 5ea003b Add pyvmomi version warning to Getting Started with VMware docs (`#32845`_)
|
||||
|
||||
* 44f08d0 Pass None as memory limit. (`#32841`_)
|
||||
|
||||
* feebe69 Back-port `#32813`_ to 2015.8 (`#32839`_)
|
||||
|
||||
* 3b81031 various improvements on cloud deploy script docs (`#32659`_)
|
||||
|
||||
* bf85987 update bootstrap to 2016.04.18 release (`#32668`_)
|
||||
|
||||
* 83dee63 Back-port `#29322`_ to 2015.8 (`#32785`_)
|
||||
|
||||
- **PR** `#32787`_: (*rallytime*) Back-port `#32722`_ to 2015.8
|
||||
|
||||
- **PR** `#32786`_: (*rallytime*) Back-port `#32703`_ to 2015.8
|
||||
|
||||
* a6a42740 Merge branch 'pr-32775' into 2015.8
|
||||
|
||||
* cda00f4 Improve documentation on pygit2 versions (`#32779`_)
|
||||
|
||||
* 1d6d234 Properly handle minion failback failure. (`#32749`_)
|
||||
|
||||
* 3751a27 Document pillar cache options (`#32643`_)
|
||||
|
||||
* 35c8af3 modules.win_dacl: consistent case of dacl constants (`#32720`_)
|
||||
|
||||
* 2cd0817 Update external auth documentation to list supported matcher. (`#32733`_)
|
||||
|
||||
* bba089d Check dependencies type before appling str operations (`#32693`_)
|
||||
|
||||
* 3aa0605 Handle when beacon not configured and we try to enable/disable them (`#32692`_)
|
||||
|
||||
- **PR** `#32718`_: (*garethgreenaway*) Fixes to schedule.list in 2015.8
|
||||
|
||||
- **PR** `#32684`_: (*captaininspiration*) Fix routes for redhat < 6
|
||||
|
||||
* 7cdd512 Handle a couple of arguments better (Azure) (`#32683`_)
|
||||
|
||||
* aaa03bc Fix for issue 32523 (`#32672`_)
|
||||
|
||||
* 21081b1 Don't access deprecated Exception.message attribute. (`#32556`_)
|
||||
|
||||
* 5d1e9a4 Lower log level for pillar cache (`#32655`_)
|
||||
|
||||
- **PR** `#32588`_: (*anlutro*) Fix salt-ssh module function call argument type juggling by JSON encoding them
|
||||
|
||||
* 5e7edfc yumpkg: Ignore epoch in version comparison for explict versions without an epoch (`#32563`_)
|
||||
|
||||
* fea6056 Fixing critical bug to remove only the specified Host instead of the entire Host cluster (`#32640`_)
|
||||
|
||||
* 0477f66 align OS grains from older SLES with current one (`#32649`_)
|
||||
|
||||
* 8d46244 Prevent crash if pygit2 package is requesting re-compilation of the e⦠(`#32652`_)
|
||||
|
||||
- **PR** `#32614`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
- **PR** `#32616`_: (*rallytime*) Back-port `#32547`_ to 2015.8
|
||||
|
||||
* 3047471 Fix comments value in salt.states.pkgrepo example (`#32604`_)
|
||||
|
||||
* ab9da90 Revert PR `#32480`_ and apply `#32314`_ with fixes / documentation (`#32558`_)
|
||||
|
||||
* c84c921 Better log message on minion restart if master couldn't be reached. (`#32576`_)
|
||||
|
||||
* 3c81798 Don't return None from eval_master (`#32555`_)
|
||||
|
||||
- **PR** `#32536`_: (*rallytime*) Back-port `#31898`_ to 2015.8
|
||||
|
||||
* d12a1c2 Fix binary search and replace (`#32542`_)
|
||||
|
||||
- **PR** `#32539`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
- **PR** `#32531`_: (*ticosax*) [dockerng] Fix support of dockerng.volume_present when no volume is on present.
|
||||
|
||||
* 5d73d54 Enhance dockerng.wait() to control success on exit_code and on already stopped containers (`#32475`_)
|
||||
|
||||
* 214f01e Bugfix: salt-key crashes if tries to generate keys to the directory w/o write access (`#32436`_)
|
||||
|
||||
* 288839f Turn on exc_info when logging failed minion startup (`#32515`_)
|
||||
|
||||
* 08a8020 Add ignore_epoch option to pkg.installed/removed/purged states (`#32520`_)
|
||||
|
||||
* 492ebfc Isbm zypper list products sles11 crash (`#32505`_)
|
||||
|
||||
* ae89882 Clear VCS fsbackend and git_pillar locks on master start (`#32480`_)
|
||||
|
||||
* a6482a3 Use win32api to get Total System Memory (`#32491`_)
|
||||
|
||||
- **PR** `#32487`_: (*terminalmage*) Add explanation of nonzero epoch requirement to pkg.installed state documentation
|
||||
|
||||
- **PR** `#32482`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
* f5bd6bd Backport 31164 and 31364 (`#32474`_)
|
||||
|
||||
- **PR** `#32450`_: (*cachedout*) Pass parser options into batch mode
|
||||
|
||||
* b299835 Issue `#28706`_: Fix state user.present behavior. (`#32448`_)
|
||||
|
||||
* cef33d5 Argument name in docs should match actual arg name (`#32445`_)
|
||||
|
||||
- **PR** `#32432`_: (*ticosax*) [dockerng] Fix Domainname introspection
|
||||
|
||||
- **PR** `#32427`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
- **PR** `#32423`_: (*jtand*) Update glusterfs_test to be inline with `#32312`_
|
||||
|
||||
- **PR** `#32425`_: (*cachedout*) Fix salt-cloud paralell provisioning
|
||||
|
||||
* 51fb2ac FreeBSD supports packages in format java/openjdk7 so the prior commit broke that functionality. Check freebsd/pkg`#1409`_ for more info.
|
||||
|
||||
* 709410a Improve git_pillar documentation/logging
|
||||
|
||||
* c53efc3 Update master config docs
|
||||
|
||||
- **PR** `#32323`_: (*mcalmer*) fix sorting by latest version when called with an attribute
|
||||
|
||||
- **PR** `#32376`_: (*amontalban*) Fixes saltstack/salt`#28262`_
|
||||
|
||||
* 0d9a06b Cleaner deprecation process with decorators
|
||||
|
||||
* 6979fda Correcty index glusterfs bricks
|
||||
|
||||
- **PR** `#32393`_: (*jfindlay*) modules.win_timezone: don't list all zones in debug log
|
||||
|
||||
- **PR** `#32372`_: (*rallytime*) Back-port `#32358`_ to 2015.8
|
||||
|
||||
- **PR** `#32392`_: (*multani*) Fix documentation on boto_asg and boto_elb modules and states
|
||||
|
||||
- **PR** `#32373`_: (*cachedout*) Resolve memory leak in authentication
|
||||
|
||||
- **PR** `#32126`_: (*cro*) Add a couple CLI examples for the highstate outputter.
|
||||
|
||||
- **PR** `#32353`_: (*mcalmer*) Prevent metadata download when listing installed products
|
||||
|
||||
- **PR** `#32321`_: (*abednarik*) Better message when minion fail to start
|
||||
|
||||
- **PR** `#32345`_: (*nmadhok*) [2015.8] Check if profile key exists in vm_ dict
|
||||
|
||||
- **PR** `#32343`_: (*Ferbla*) Fixed win_wua example documentation
|
||||
|
||||
- **PR** `#32360`_: (*rallytime*) Make sure hash_type is lowercase in master/minion config files
|
||||
|
||||
- **PR** `#32361`_: (*cro*) SDB is no longer experimental
|
||||
|
||||
- **PR** `#32336`_: (*rallytime*) Back-port `#28639`_ to 2015.8
|
||||
|
||||
- **PR** `#32332`_: (*rallytime*) Don't unsubscribe from open events on the CLI too early on long-running commands
|
||||
|
||||
- **PR** `#32333`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
- **PR** `#32289`_: (*rallytime*) New salt-cloud instances should not use old hash_type default.
|
||||
|
||||
- **PR** `#32291`_: (*twangboy*) Fix bad output for chocolatey.version (fixes `#14277`_)
|
||||
|
||||
- **PR** `#32295`_: (*rallytime*) Test the contents of 'deploy_scripts_search_path' in salt.config.cloud_config
|
||||
|
||||
- **PR** `#32315`_: (*ahus1*) fixing file.managed with requests lib
|
||||
|
||||
- **PR** `#32316`_: (*vutny*) Update Salt Bootstrap tutorial
|
||||
|
||||
- **PR** `#32325`_: (*bdrung*) Re-add shebang to ssh-id-wrapper shell script
|
||||
|
||||
- **PR** `#32326`_: (*bdrung*) Fix typos
|
||||
|
||||
- **PR** `#32300`_: (*twangboy*) Add documentation to disable winrepo/winrepo_ng
|
||||
|
||||
- **PR** `#32288`_: (*terminalmage*) use dictupdate.merge instead of dict.update to merge CLI pillar overrides
|
||||
|
||||
- **PR** `#32243`_: (*isbm*) Ensure latest pkg.info_installed ensure latest
|
||||
|
||||
- **PR** `#32268`_: (*ticosax*) [dockerng] Improve detection for older versions of docker-py
|
||||
|
||||
- **PR** `#32258`_: (*jacobhammons*) Replaces incorrect reference to `master_alive_check`
|
||||
|
||||
- **PR** `#32254`_: (*twangboy*) Fix Display Name with spaces in win_servermanager
|
||||
|
||||
- **PR** `#32248`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
- **PR** `#32230`_: (*terminalmage*) systemd.py: Support both update-rc.d and chkconfig as managers of sysv services
|
||||
|
||||
- **PR** `#32249`_: (*jacobhammons*) Fixes windows download paths to account for patch
|
||||
|
||||
- **PR** `#32221`_: (*dmurphy18*) Fix version check, fix extracting Major and Minor versions from __ver…
|
||||
|
||||
- **PR** `#32227`_: (*twangboy*) Remove list2cmdline usage from win_service.py
|
||||
|
||||
- **PR** `#32239`_: (*anlutro*) Add state file name to warning log line
|
||||
|
||||
- **PR** `#32215`_: (*DmitryKuzmenko*) rhel oscodename
|
||||
|
||||
- **PR** `#32217`_: (*jacobhammons*) 2015.8.8.2 release notes
|
||||
|
||||
- **PR** `#32212`_: (*rallytime*) Back-port `#32197`_ to 2015.8
|
||||
|
||||
- **PR** `#32211`_: (*rallytime*) Back-port `#32210`_ to 2015.8
|
||||
|
||||
- **PR** `#32209`_: (*rallytime*) Back-port `#32208`_ to 2015.8
|
||||
|
||||
- **PR** `#32204`_: (*ticosax*) [dockerng] Consider labels carried by the image when comparing user defined labels.
|
||||
|
||||
- **PR** `#32186`_: (*rallytime*) Add some "best practices" information to test documentation
|
||||
|
||||
- **PR** `#32176`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
- **PR** `#32163`_: (*rallytime*) Update nacl.config docs to use key value instead of 'None'
|
||||
|
||||
- **PR** `#32166`_: (*vutny*) `salt.states.file`: correct examples with multiline YAML string
|
||||
|
||||
- **PR** `#32168`_: (*rallytime*) Lint 2015.8
|
||||
|
||||
- **PR** `#32165`_: (*terminalmage*) Make __virtual__ for rhservice.py more robust
|
||||
|
||||
- **PR** `#32160`_: (*cachedout*) Fix beacon tutorial docs
|
||||
|
||||
- **PR** `#32145`_: (*paclat*) fixes 29817
|
||||
|
||||
- **PR** `#32133`_: (*basepi*) Pass eauth user/groups through salt-api to destination functions
|
||||
|
||||
- **PR** `#32127`_: (*rallytime*) Add runners to __salt__ docs
|
||||
|
||||
- **PR** `#32143`_: (*DmitryKuzmenko*) Set auth retry count to 0 if multimaster mode is failover.
|
||||
|
||||
- **PR** `#32134`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
- **PR** `#32091`_: (*clarkperkins*) Fixed the regression in 410da78
|
||||
|
||||
- **PR** `#32135`_: (*rallytime*) [2015.8] Support multiple valid option types when performing type checks
|
||||
|
||||
- **PR** `#31760`_: (*sakateka*) SMinion need wait future from eval_master
|
||||
|
||||
- **PR** `#32106`_: (*jfindlay*) update suse master service patch
|
||||
|
||||
- **PR** `#32130`_: (*jacobhammons*) Added known issues 32004 and 32044 to 2015.8.8 release notes
|
||||
|
||||
- **PR** `#32105`_: (*clarkperkins*) Fixed invalid deploy_scripts_search_path
|
||||
|
||||
- **PR** `#32117`_: (*tomlaredo*) Fixed validation type for file_ignore_glob
|
||||
|
||||
- **PR** `#32113`_: (*sakateka*) Fix log message for AsyncAuth initialization
|
||||
|
||||
- **PR** `#32116`_: (*ticosax*) Obtain default value of `memory_swap` from the container.
|
||||
|
||||
- **PR** `#32098`_: (*rallytime*) Back-port `#32083`_ to 2015.8
|
||||
|
||||
- **PR** `#32099`_: (*jacobhammons*) 2015.8.8 release docs
|
||||
|
||||
- **PR** `#32088`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
- **PR** `#32074`_: (*Xiami2012*) Fix code for proto args in modules.iptables
|
||||
|
||||
- **PR** `#32053`_: (*basepi*) [2015.8] Fix rabbitmq_user.present tag handling
|
||||
|
||||
- **PR** `#32023`_: (*sbreidba*) Move constant declaration into member variable to avoid issues when m…
|
||||
|
||||
- **PR** `#32026`_: (*techhat*) Don't require the decode_out file to already exist
|
||||
|
||||
- **PR** `#32019`_: (*rallytime*) Back-port `#32012`_ to 2015.8
|
||||
|
||||
- **PR** `#32015`_: (*ticosax*) [dockerng] Fix ports exposition when protocol is passed.
|
||||
|
||||
- **PR** `#31999`_: (*jacobhammons*) Fixes a doc build exception caused by missing mocks for modules.win_dacl
|
||||
|
||||
- **PR** `#31992`_: (*notpeter*) salt-cloud: add D2 and G2 EC2 instance types
|
||||
|
||||
- **PR** `#31981`_: (*lloydoliver*) include rotational disks in grains under linux
|
||||
|
||||
- **PR** `#31970`_: (*twangboy*) Add apply_template_on_contents for windows
|
||||
|
||||
- **PR** `#31960`_: (*aletourneau*) fixed ec2 get_console_output
|
||||
|
||||
- **PR** `#31958`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8
|
||||
|
||||
* 3934c66 Merge branch '2015.5' into '2015.8'
|
||||
|
||||
- **PR** `#31935`_: (*twangboy*) Back port nullsoft build script from 2015.8
|
||||
|
||||
- **PR** `#31912`_: (*jfindlay*) log.mixins: remove extermporaneous .record
|
||||
|
||||
.. _`#26518`: https://github.com/saltstack/salt/pull/26518
|
||||
.. _`#26648`: https://github.com/saltstack/salt/pull/26648
|
||||
.. _`#26676`: https://github.com/saltstack/salt/pull/26676
|
||||
.. _`#28639`: https://github.com/saltstack/salt/pull/28639
|
||||
.. _`#29322`: https://github.com/saltstack/salt/pull/29322
|
||||
.. _`#30824`: https://github.com/saltstack/salt/pull/30824
|
||||
.. _`#31139`: https://github.com/saltstack/salt/pull/31139
|
||||
.. _`#31162`: https://github.com/saltstack/salt/pull/31162
|
||||
.. _`#31164`: https://github.com/saltstack/salt/pull/31164
|
||||
.. _`#31364`: https://github.com/saltstack/salt/pull/31364
|
||||
.. _`#31382`: https://github.com/saltstack/salt/pull/31382
|
||||
.. _`#31598`: https://github.com/saltstack/salt/pull/31598
|
||||
.. _`#31760`: https://github.com/saltstack/salt/pull/31760
|
||||
.. _`#31769`: https://github.com/saltstack/salt/pull/31769
|
||||
.. _`#31826`: https://github.com/saltstack/salt/pull/31826
|
||||
.. _`#31898`: https://github.com/saltstack/salt/pull/31898
|
||||
.. _`#31912`: https://github.com/saltstack/salt/pull/31912
|
||||
.. _`#31929`: https://github.com/saltstack/salt/pull/31929
|
||||
.. _`#31935`: https://github.com/saltstack/salt/pull/31935
|
||||
.. _`#31957`: https://github.com/saltstack/salt/pull/31957
|
||||
.. _`#31958`: https://github.com/saltstack/salt/pull/31958
|
||||
.. _`#31960`: https://github.com/saltstack/salt/pull/31960
|
||||
.. _`#31970`: https://github.com/saltstack/salt/pull/31970
|
||||
.. _`#31972`: https://github.com/saltstack/salt/pull/31972
|
||||
.. _`#31981`: https://github.com/saltstack/salt/pull/31981
|
||||
.. _`#31992`: https://github.com/saltstack/salt/pull/31992
|
||||
.. _`#31999`: https://github.com/saltstack/salt/pull/31999
|
||||
.. _`#32002`: https://github.com/saltstack/salt/pull/32002
|
||||
.. _`#32012`: https://github.com/saltstack/salt/pull/32012
|
||||
.. _`#32015`: https://github.com/saltstack/salt/pull/32015
|
||||
.. _`#32019`: https://github.com/saltstack/salt/pull/32019
|
||||
.. _`#32023`: https://github.com/saltstack/salt/pull/32023
|
||||
.. _`#32026`: https://github.com/saltstack/salt/pull/32026
|
||||
.. _`#32038`: https://github.com/saltstack/salt/pull/32038
|
||||
.. _`#32051`: https://github.com/saltstack/salt/pull/32051
|
||||
.. _`#32053`: https://github.com/saltstack/salt/pull/32053
|
||||
.. _`#32056`: https://github.com/saltstack/salt/pull/32056
|
||||
.. _`#32065`: https://github.com/saltstack/salt/pull/32065
|
||||
.. _`#32074`: https://github.com/saltstack/salt/pull/32074
|
||||
.. _`#32083`: https://github.com/saltstack/salt/pull/32083
|
||||
.. _`#32088`: https://github.com/saltstack/salt/pull/32088
|
||||
.. _`#32091`: https://github.com/saltstack/salt/pull/32091
|
||||
.. _`#32096`: https://github.com/saltstack/salt/pull/32096
|
||||
.. _`#32098`: https://github.com/saltstack/salt/pull/32098
|
||||
.. _`#32099`: https://github.com/saltstack/salt/pull/32099
|
||||
.. _`#32100`: https://github.com/saltstack/salt/pull/32100
|
||||
.. _`#32104`: https://github.com/saltstack/salt/pull/32104
|
||||
.. _`#32105`: https://github.com/saltstack/salt/pull/32105
|
||||
.. _`#32106`: https://github.com/saltstack/salt/pull/32106
|
||||
.. _`#32113`: https://github.com/saltstack/salt/pull/32113
|
||||
.. _`#32116`: https://github.com/saltstack/salt/pull/32116
|
||||
.. _`#32117`: https://github.com/saltstack/salt/pull/32117
|
||||
.. _`#32126`: https://github.com/saltstack/salt/pull/32126
|
||||
.. _`#32127`: https://github.com/saltstack/salt/pull/32127
|
||||
.. _`#32129`: https://github.com/saltstack/salt/pull/32129
|
||||
.. _`#32130`: https://github.com/saltstack/salt/pull/32130
|
||||
.. _`#32133`: https://github.com/saltstack/salt/pull/32133
|
||||
.. _`#32134`: https://github.com/saltstack/salt/pull/32134
|
||||
.. _`#32135`: https://github.com/saltstack/salt/pull/32135
|
||||
.. _`#32141`: https://github.com/saltstack/salt/pull/32141
|
||||
.. _`#32143`: https://github.com/saltstack/salt/pull/32143
|
||||
.. _`#32145`: https://github.com/saltstack/salt/pull/32145
|
||||
.. _`#32154`: https://github.com/saltstack/salt/pull/32154
|
||||
.. _`#32160`: https://github.com/saltstack/salt/pull/32160
|
||||
.. _`#32162`: https://github.com/saltstack/salt/pull/32162
|
||||
.. _`#32163`: https://github.com/saltstack/salt/pull/32163
|
||||
.. _`#32164`: https://github.com/saltstack/salt/pull/32164
|
||||
.. _`#32165`: https://github.com/saltstack/salt/pull/32165
|
||||
.. _`#32166`: https://github.com/saltstack/salt/pull/32166
|
||||
.. _`#32168`: https://github.com/saltstack/salt/pull/32168
|
||||
.. _`#32170`: https://github.com/saltstack/salt/pull/32170
|
||||
.. _`#32176`: https://github.com/saltstack/salt/pull/32176
|
||||
.. _`#32186`: https://github.com/saltstack/salt/pull/32186
|
||||
.. _`#32192`: https://github.com/saltstack/salt/pull/32192
|
||||
.. _`#32193`: https://github.com/saltstack/salt/pull/32193
|
||||
.. _`#32196`: https://github.com/saltstack/salt/pull/32196
|
||||
.. _`#32197`: https://github.com/saltstack/salt/pull/32197
|
||||
.. _`#32204`: https://github.com/saltstack/salt/pull/32204
|
||||
.. _`#32208`: https://github.com/saltstack/salt/pull/32208
|
||||
.. _`#32209`: https://github.com/saltstack/salt/pull/32209
|
||||
.. _`#32210`: https://github.com/saltstack/salt/pull/32210
|
||||
.. _`#32211`: https://github.com/saltstack/salt/pull/32211
|
||||
.. _`#32212`: https://github.com/saltstack/salt/pull/32212
|
||||
.. _`#32215`: https://github.com/saltstack/salt/pull/32215
|
||||
.. _`#32217`: https://github.com/saltstack/salt/pull/32217
|
||||
.. _`#32218`: https://github.com/saltstack/salt/pull/32218
|
||||
.. _`#32221`: https://github.com/saltstack/salt/pull/32221
|
||||
.. _`#32223`: https://github.com/saltstack/salt/pull/32223
|
||||
.. _`#32227`: https://github.com/saltstack/salt/pull/32227
|
||||
.. _`#32230`: https://github.com/saltstack/salt/pull/32230
|
||||
.. _`#32239`: https://github.com/saltstack/salt/pull/32239
|
||||
.. _`#32243`: https://github.com/saltstack/salt/pull/32243
|
||||
.. _`#32248`: https://github.com/saltstack/salt/pull/32248
|
||||
.. _`#32249`: https://github.com/saltstack/salt/pull/32249
|
||||
.. _`#32254`: https://github.com/saltstack/salt/pull/32254
|
||||
.. _`#32258`: https://github.com/saltstack/salt/pull/32258
|
||||
.. _`#32262`: https://github.com/saltstack/salt/pull/32262
|
||||
.. _`#32268`: https://github.com/saltstack/salt/pull/32268
|
||||
.. _`#32284`: https://github.com/saltstack/salt/pull/32284
|
||||
.. _`#32288`: https://github.com/saltstack/salt/pull/32288
|
||||
.. _`#32289`: https://github.com/saltstack/salt/pull/32289
|
||||
.. _`#32291`: https://github.com/saltstack/salt/pull/32291
|
||||
.. _`#32293`: https://github.com/saltstack/salt/pull/32293
|
||||
.. _`#32295`: https://github.com/saltstack/salt/pull/32295
|
||||
.. _`#32300`: https://github.com/saltstack/salt/pull/32300
|
||||
.. _`#32302`: https://github.com/saltstack/salt/pull/32302
|
||||
.. _`#32312`: https://github.com/saltstack/salt/pull/32312
|
||||
.. _`#32314`: https://github.com/saltstack/salt/pull/32314
|
||||
.. _`#32315`: https://github.com/saltstack/salt/pull/32315
|
||||
.. _`#32316`: https://github.com/saltstack/salt/pull/32316
|
||||
.. _`#32321`: https://github.com/saltstack/salt/pull/32321
|
||||
.. _`#32323`: https://github.com/saltstack/salt/pull/32323
|
||||
.. _`#32325`: https://github.com/saltstack/salt/pull/32325
|
||||
.. _`#32326`: https://github.com/saltstack/salt/pull/32326
|
||||
.. _`#32332`: https://github.com/saltstack/salt/pull/32332
|
||||
.. _`#32333`: https://github.com/saltstack/salt/pull/32333
|
||||
.. _`#32336`: https://github.com/saltstack/salt/pull/32336
|
||||
.. _`#32339`: https://github.com/saltstack/salt/pull/32339
|
||||
.. _`#32343`: https://github.com/saltstack/salt/pull/32343
|
||||
.. _`#32344`: https://github.com/saltstack/salt/pull/32344
|
||||
.. _`#32345`: https://github.com/saltstack/salt/pull/32345
|
||||
.. _`#32353`: https://github.com/saltstack/salt/pull/32353
|
||||
.. _`#32358`: https://github.com/saltstack/salt/pull/32358
|
||||
.. _`#32360`: https://github.com/saltstack/salt/pull/32360
|
||||
.. _`#32361`: https://github.com/saltstack/salt/pull/32361
|
||||
.. _`#32372`: https://github.com/saltstack/salt/pull/32372
|
||||
.. _`#32373`: https://github.com/saltstack/salt/pull/32373
|
||||
.. _`#32374`: https://github.com/saltstack/salt/pull/32374
|
||||
.. _`#32376`: https://github.com/saltstack/salt/pull/32376
|
||||
.. _`#32392`: https://github.com/saltstack/salt/pull/32392
|
||||
.. _`#32393`: https://github.com/saltstack/salt/pull/32393
|
||||
.. _`#32399`: https://github.com/saltstack/salt/pull/32399
|
||||
.. _`#32418`: https://github.com/saltstack/salt/pull/32418
|
||||
.. _`#32421`: https://github.com/saltstack/salt/pull/32421
|
||||
.. _`#32423`: https://github.com/saltstack/salt/pull/32423
|
||||
.. _`#32425`: https://github.com/saltstack/salt/pull/32425
|
||||
.. _`#32427`: https://github.com/saltstack/salt/pull/32427
|
||||
.. _`#32432`: https://github.com/saltstack/salt/pull/32432
|
||||
.. _`#32436`: https://github.com/saltstack/salt/pull/32436
|
||||
.. _`#32441`: https://github.com/saltstack/salt/pull/32441
|
||||
.. _`#32445`: https://github.com/saltstack/salt/pull/32445
|
||||
.. _`#32448`: https://github.com/saltstack/salt/pull/32448
|
||||
.. _`#32450`: https://github.com/saltstack/salt/pull/32450
|
||||
.. _`#32454`: https://github.com/saltstack/salt/pull/32454
|
||||
.. _`#32458`: https://github.com/saltstack/salt/pull/32458
|
||||
.. _`#32474`: https://github.com/saltstack/salt/pull/32474
|
||||
.. _`#32475`: https://github.com/saltstack/salt/pull/32475
|
||||
.. _`#32480`: https://github.com/saltstack/salt/pull/32480
|
||||
.. _`#32482`: https://github.com/saltstack/salt/pull/32482
|
||||
.. _`#32487`: https://github.com/saltstack/salt/pull/32487
|
||||
.. _`#32491`: https://github.com/saltstack/salt/pull/32491
|
||||
.. _`#32505`: https://github.com/saltstack/salt/pull/32505
|
||||
.. _`#32515`: https://github.com/saltstack/salt/pull/32515
|
||||
.. _`#32520`: https://github.com/saltstack/salt/pull/32520
|
||||
.. _`#32528`: https://github.com/saltstack/salt/pull/32528
|
||||
.. _`#32531`: https://github.com/saltstack/salt/pull/32531
|
||||
.. _`#32536`: https://github.com/saltstack/salt/pull/32536
|
||||
.. _`#32538`: https://github.com/saltstack/salt/pull/32538
|
||||
.. _`#32539`: https://github.com/saltstack/salt/pull/32539
|
||||
.. _`#32542`: https://github.com/saltstack/salt/pull/32542
|
||||
.. _`#32547`: https://github.com/saltstack/salt/pull/32547
|
||||
.. _`#32552`: https://github.com/saltstack/salt/pull/32552
|
||||
.. _`#32555`: https://github.com/saltstack/salt/pull/32555
|
||||
.. _`#32556`: https://github.com/saltstack/salt/pull/32556
|
||||
.. _`#32558`: https://github.com/saltstack/salt/pull/32558
|
||||
.. _`#32561`: https://github.com/saltstack/salt/pull/32561
|
||||
.. _`#32563`: https://github.com/saltstack/salt/pull/32563
|
||||
.. _`#32576`: https://github.com/saltstack/salt/pull/32576
|
||||
.. _`#32588`: https://github.com/saltstack/salt/pull/32588
|
||||
.. _`#32590`: https://github.com/saltstack/salt/pull/32590
|
||||
.. _`#32604`: https://github.com/saltstack/salt/pull/32604
|
||||
.. _`#32614`: https://github.com/saltstack/salt/pull/32614
|
||||
.. _`#32616`: https://github.com/saltstack/salt/pull/32616
|
||||
.. _`#32638`: https://github.com/saltstack/salt/pull/32638
|
||||
.. _`#32639`: https://github.com/saltstack/salt/pull/32639
|
||||
.. _`#32640`: https://github.com/saltstack/salt/pull/32640
|
||||
.. _`#32643`: https://github.com/saltstack/salt/pull/32643
|
||||
.. _`#32649`: https://github.com/saltstack/salt/pull/32649
|
||||
.. _`#32652`: https://github.com/saltstack/salt/pull/32652
|
||||
.. _`#32655`: https://github.com/saltstack/salt/pull/32655
|
||||
.. _`#32657`: https://github.com/saltstack/salt/pull/32657
|
||||
.. _`#32659`: https://github.com/saltstack/salt/pull/32659
|
||||
.. _`#32667`: https://github.com/saltstack/salt/pull/32667
|
||||
.. _`#32668`: https://github.com/saltstack/salt/pull/32668
|
||||
.. _`#32672`: https://github.com/saltstack/salt/pull/32672
|
||||
.. _`#32674`: https://github.com/saltstack/salt/pull/32674
|
||||
.. _`#32675`: https://github.com/saltstack/salt/pull/32675
|
||||
.. _`#32682`: https://github.com/saltstack/salt/pull/32682
|
||||
.. _`#32683`: https://github.com/saltstack/salt/pull/32683
|
||||
.. _`#32684`: https://github.com/saltstack/salt/pull/32684
|
||||
.. _`#32686`: https://github.com/saltstack/salt/pull/32686
|
||||
.. _`#32691`: https://github.com/saltstack/salt/pull/32691
|
||||
.. _`#32692`: https://github.com/saltstack/salt/pull/32692
|
||||
.. _`#32693`: https://github.com/saltstack/salt/pull/32693
|
||||
.. _`#32703`: https://github.com/saltstack/salt/pull/32703
|
||||
.. _`#32718`: https://github.com/saltstack/salt/pull/32718
|
||||
.. _`#32720`: https://github.com/saltstack/salt/pull/32720
|
||||
.. _`#32722`: https://github.com/saltstack/salt/pull/32722
|
||||
.. _`#32732`: https://github.com/saltstack/salt/pull/32732
|
||||
.. _`#32733`: https://github.com/saltstack/salt/pull/32733
|
||||
.. _`#32749`: https://github.com/saltstack/salt/pull/32749
|
||||
.. _`#32776`: https://github.com/saltstack/salt/pull/32776
|
||||
.. _`#32779`: https://github.com/saltstack/salt/pull/32779
|
||||
.. _`#32785`: https://github.com/saltstack/salt/pull/32785
|
||||
.. _`#32786`: https://github.com/saltstack/salt/pull/32786
|
||||
.. _`#32787`: https://github.com/saltstack/salt/pull/32787
|
||||
.. _`#32796`: https://github.com/saltstack/salt/pull/32796
|
||||
.. _`#32813`: https://github.com/saltstack/salt/pull/32813
|
||||
.. _`#32818`: https://github.com/saltstack/salt/pull/32818
|
||||
.. _`#32837`: https://github.com/saltstack/salt/pull/32837
|
||||
.. _`#32839`: https://github.com/saltstack/salt/pull/32839
|
||||
.. _`#32841`: https://github.com/saltstack/salt/pull/32841
|
||||
.. _`#32844`: https://github.com/saltstack/salt/pull/32844
|
||||
.. _`#32845`: https://github.com/saltstack/salt/pull/32845
|
||||
.. _`#32847`: https://github.com/saltstack/salt/pull/32847
|
||||
.. _`#32848`: https://github.com/saltstack/salt/pull/32848
|
||||
.. _`#32865`: https://github.com/saltstack/salt/pull/32865
|
||||
.. _`#32868`: https://github.com/saltstack/salt/pull/32868
|
||||
.. _`#32869`: https://github.com/saltstack/salt/pull/32869
|
||||
.. _`#32878`: https://github.com/saltstack/salt/pull/32878
|
||||
.. _`#32880`: https://github.com/saltstack/salt/pull/32880
|
||||
.. _`#32883`: https://github.com/saltstack/salt/pull/32883
|
||||
.. _`#32884`: https://github.com/saltstack/salt/pull/32884
|
||||
.. _`#32892`: https://github.com/saltstack/salt/pull/32892
|
||||
.. _`#32900`: https://github.com/saltstack/salt/pull/32900
|
||||
.. _`#32906`: https://github.com/saltstack/salt/pull/32906
|
||||
.. _`#32908`: https://github.com/saltstack/salt/pull/32908
|
||||
.. _`#32922`: https://github.com/saltstack/salt/pull/32922
|
||||
.. _`#32925`: https://github.com/saltstack/salt/pull/32925
|
||||
.. _`#32926`: https://github.com/saltstack/salt/pull/32926
|
||||
.. _`#32928`: https://github.com/saltstack/salt/pull/32928
|
||||
.. _`#32934`: https://github.com/saltstack/salt/pull/32934
|
||||
.. _`#32955`: https://github.com/saltstack/salt/pull/32955
|
||||
.. _`#32958`: https://github.com/saltstack/salt/pull/32958
|
||||
.. _`#32970`: https://github.com/saltstack/salt/pull/32970
|
||||
.. _`#32986`: https://github.com/saltstack/salt/pull/32986
|
||||
.. _`#32994`: https://github.com/saltstack/salt/pull/32994
|
||||
.. _`#32996`: https://github.com/saltstack/salt/pull/32996
|
||||
.. _`#33002`: https://github.com/saltstack/salt/pull/33002
|
||||
.. _`#33017`: https://github.com/saltstack/salt/pull/33017
|
||||
.. _`#33021`: https://github.com/saltstack/salt/pull/33021
|
||||
.. _`#33025`: https://github.com/saltstack/salt/pull/33025
|
||||
.. _`#33030`: https://github.com/saltstack/salt/pull/33030
|
||||
.. _`#33031`: https://github.com/saltstack/salt/pull/33031
|
||||
.. _`#33039`: https://github.com/saltstack/salt/pull/33039
|
||||
.. _`#33040`: https://github.com/saltstack/salt/pull/33040
|
||||
.. _`#33044`: https://github.com/saltstack/salt/pull/33044
|
||||
.. _`#33045`: https://github.com/saltstack/salt/pull/33045
|
||||
.. _`#33048`: https://github.com/saltstack/salt/pull/33048
|
||||
.. _`#33049`: https://github.com/saltstack/salt/pull/33049
|
||||
.. _`#33050`: https://github.com/saltstack/salt/pull/33050
|
||||
.. _`#33053`: https://github.com/saltstack/salt/pull/33053
|
||||
.. _`#33054`: https://github.com/saltstack/salt/pull/33054
|
||||
.. _`#33055`: https://github.com/saltstack/salt/pull/33055
|
||||
.. _`#33056`: https://github.com/saltstack/salt/pull/33056
|
||||
.. _`#33060`: https://github.com/saltstack/salt/pull/33060
|
||||
.. _`#33061`: https://github.com/saltstack/salt/pull/33061
|
||||
.. _`#33064`: https://github.com/saltstack/salt/pull/33064
|
||||
.. _`#33067`: https://github.com/saltstack/salt/pull/33067
|
||||
.. _`#33078`: https://github.com/saltstack/salt/pull/33078
|
||||
.. _`#33080`: https://github.com/saltstack/salt/pull/33080
|
||||
.. _`#33081`: https://github.com/saltstack/salt/pull/33081
|
||||
.. _`#33082`: https://github.com/saltstack/salt/pull/33082
|
||||
.. _`#33084`: https://github.com/saltstack/salt/pull/33084
|
||||
.. _`#33088`: https://github.com/saltstack/salt/pull/33088
|
||||
.. _`#33096`: https://github.com/saltstack/salt/pull/33096
|
||||
.. _`#33098`: https://github.com/saltstack/salt/pull/33098
|
||||
.. _`#33099`: https://github.com/saltstack/salt/pull/33099
|
||||
.. _`#33100`: https://github.com/saltstack/salt/pull/33100
|
||||
.. _`#33101`: https://github.com/saltstack/salt/pull/33101
|
||||
.. _`#33102`: https://github.com/saltstack/salt/pull/33102
|
||||
.. _`#33106`: https://github.com/saltstack/salt/pull/33106
|
||||
.. _`#33129`: https://github.com/saltstack/salt/pull/33129
|
||||
.. _`#33132`: https://github.com/saltstack/salt/pull/33132
|
||||
.. _`#33135`: https://github.com/saltstack/salt/pull/33135
|
||||
.. _`#33139`: https://github.com/saltstack/salt/pull/33139
|
||||
.. _`#33140`: https://github.com/saltstack/salt/pull/33140
|
||||
.. _`#33141`: https://github.com/saltstack/salt/pull/33141
|
||||
.. _`#33142`: https://github.com/saltstack/salt/pull/33142
|
||||
.. _`#33144`: https://github.com/saltstack/salt/pull/33144
|
||||
.. _`#33156`: https://github.com/saltstack/salt/pull/33156
|
||||
|
|
|
@ -61,6 +61,9 @@ Core Changes
|
|||
the number of times a minion should attempt to contact a master to attempt
|
||||
a connection. This allows better handling of occasional master downtime in
|
||||
a multi-master topology.
|
||||
- The default directory for deploying the salt-thin tarball has changed for
|
||||
salt-ssh. It is now /var/tmp instead of /tmp. Users may also wish
|
||||
to delete any directories in /tmp ending with `_salt/`. (:issue:`32771`)
|
||||
|
||||
|
||||
External Module Packaging
|
||||
|
|
|
@ -99,6 +99,17 @@ Alternatively ssh agent forwarding can be used by setting the priv to agent-forw
|
|||
Calling Salt SSH
|
||||
================
|
||||
|
||||
.. note:: ``salt-ssh`` on RHEL/CentOS 5
|
||||
|
||||
The ``salt-ssh`` command requires at least python 2.6, which is not
|
||||
installed by default on RHEL/CentOS 5. An easy workaround in this
|
||||
situation is to use the ``-r`` option to run a raw shell command that
|
||||
installs python26:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-ssh centos-5-minion -r 'yum -y install epel-release ; yum -y install python26'
|
||||
|
||||
The ``salt-ssh`` command can be easily executed in the same way as a salt
|
||||
command:
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ __defopts__ = {'auth.ldap.basedn': '',
|
|||
'auth.ldap.persontype': 'person',
|
||||
'auth.ldap.groupclass': 'posixGroup',
|
||||
'auth.ldap.activedirectory': False,
|
||||
'auth.ldap.minion_stripdomains': [],
|
||||
}
|
||||
|
||||
|
||||
|
@ -362,7 +363,6 @@ def groups(username, **kwargs):
|
|||
return []
|
||||
else:
|
||||
log.error('ldap bind to determine group membership FAILED!')
|
||||
return group_list
|
||||
|
||||
return group_list
|
||||
|
||||
|
@ -406,6 +406,15 @@ def expand_ldap_entries(entries, opts=None):
|
|||
for ldap_match in search_results:
|
||||
try:
|
||||
minion_id = ldap_match[1]['cn'][0].lower()
|
||||
# Some LDAP/AD trees only have the FQDN of machines
|
||||
# in their computer lists. auth.minion_stripdomains
|
||||
# lets a user strip off configured domain names
|
||||
# and arrive at the basic minion_id
|
||||
if opts.get('auth.ldap.minion_stripdomains', None):
|
||||
for domain in opts['auth.ldap.minion_stripdomains']:
|
||||
if minion_id.endswith(domain):
|
||||
minion_id = minion_id[:-len(domain)]
|
||||
break
|
||||
retrieved_minion_ids.append(minion_id)
|
||||
except TypeError:
|
||||
# TypeError here just means that one of the returned
|
||||
|
@ -415,6 +424,7 @@ def expand_ldap_entries(entries, opts=None):
|
|||
|
||||
for minion_id in retrieved_minion_ids:
|
||||
acl_tree.append({minion_id: permissions})
|
||||
log.trace('Expanded acl_tree is: {0}'.format(acl_tree))
|
||||
except ldap.NO_SUCH_OBJECT:
|
||||
pass
|
||||
else:
|
||||
|
|
|
@ -22,6 +22,7 @@ import salt.payload
|
|||
import salt.transport
|
||||
import salt.utils.args
|
||||
import salt.utils.jid
|
||||
import salt.utils.minion
|
||||
import salt.defaults.exitcodes
|
||||
from salt.log import LOG_LEVELS
|
||||
from salt.utils import is_windows
|
||||
|
@ -254,6 +255,10 @@ class BaseCaller(object):
|
|||
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
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ except ImportError:
|
|||
HAS_ZMQ = False
|
||||
|
||||
# The directory where salt thin is deployed
|
||||
DEFAULT_THIN_DIR = '/tmp/.%%USER%%_%%FQDNUUID%%_salt'
|
||||
DEFAULT_THIN_DIR = '/var/tmp/.%%USER%%_%%FQDNUUID%%_salt'
|
||||
|
||||
# RSTR is just a delimiter to distinguish the beginning of salt STDOUT
|
||||
# and STDERR. There is no special meaning. Messages prior to RSTR in
|
||||
|
|
|
@ -835,7 +835,7 @@ def create(vm_):
|
|||
# network. If that network does not exist in the 'addresses' dictionary, then SaltCloud will
|
||||
# use the initial access_ip, and not overwrite anything.
|
||||
|
||||
if any((cloudnetwork(vm_), rackconnect(vm_))) and (ssh_interface(vm_) != 'private_ips' or rcv3):
|
||||
if any((cloudnetwork(vm_), rackconnect(vm_))) and (ssh_interface(vm_) != 'private_ips' or rcv3) and access_ip != '':
|
||||
data.public_ips = [access_ip, ]
|
||||
return data
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#======================================================================================================================
|
||||
set -o nounset # Treat unset variables as an error
|
||||
|
||||
__ScriptVersion="2016.05.10"
|
||||
__ScriptVersion="2016.05.11"
|
||||
__ScriptName="bootstrap-salt.sh"
|
||||
|
||||
#======================================================================================================================
|
||||
|
@ -5901,18 +5901,18 @@ config_salt() {
|
|||
|
||||
# Copy the minions configuration if found
|
||||
if [ -f "$_TEMP_CONFIG_DIR/minion" ]; then
|
||||
__movefile "$_TEMP_CONFIG_DIR/minion" "$_SALT_ETC_DIR" "$BS_TRUE" || return 1
|
||||
__movefile "$_TEMP_CONFIG_DIR/minion" "$_SALT_ETC_DIR" "$_CONFIG_ONLY" || return 1
|
||||
CONFIGURED_ANYTHING=$BS_TRUE
|
||||
fi
|
||||
|
||||
# Copy the minion's keys if found
|
||||
if [ -f "$_TEMP_CONFIG_DIR/minion.pem" ]; then
|
||||
__movefile "$_TEMP_CONFIG_DIR/minion.pem" "$_PKI_DIR/minion/" "$BS_TRUE" || return 1
|
||||
__movefile "$_TEMP_CONFIG_DIR/minion.pem" "$_PKI_DIR/minion/" "$_CONFIG_ONLY" || return 1
|
||||
chmod 400 "$_PKI_DIR/minion/minion.pem" || return 1
|
||||
CONFIGURED_ANYTHING=$BS_TRUE
|
||||
fi
|
||||
if [ -f "$_TEMP_CONFIG_DIR/minion.pub" ]; then
|
||||
__movefile "$_TEMP_CONFIG_DIR/minion.pub" "$_PKI_DIR/minion/" "$BS_TRUE" || return 1
|
||||
__movefile "$_TEMP_CONFIG_DIR/minion.pub" "$_PKI_DIR/minion/" "$_CONFIG_ONLY" || return 1
|
||||
chmod 664 "$_PKI_DIR/minion/minion.pub" || return 1
|
||||
CONFIGURED_ANYTHING=$BS_TRUE
|
||||
fi
|
||||
|
|
|
@ -929,6 +929,20 @@ class AsyncAuth(object):
|
|||
)
|
||||
return self.extract_aes(payload, master_pub=False)
|
||||
|
||||
def _finger_fail(self, finger, master_key):
|
||||
log.critical(
|
||||
'The specified fingerprint in the master configuration '
|
||||
'file:\n{0}\nDoes not match the authenticating master\'s '
|
||||
'key:\n{1}\nVerify that the configured fingerprint '
|
||||
'matches the fingerprint of the correct master and that '
|
||||
'this minion is not subject to a man-in-the-middle attack.'
|
||||
.format(
|
||||
finger,
|
||||
salt.utils.pem_finger(master_key, sum_type=self.opts['hash_type'])
|
||||
)
|
||||
)
|
||||
sys.exit(42)
|
||||
|
||||
|
||||
# TODO: remove, we should just return a sync wrapper of AsyncAuth
|
||||
class SAuth(AsyncAuth):
|
||||
|
@ -1141,20 +1155,6 @@ class SAuth(AsyncAuth):
|
|||
auth['publish_port'] = payload['publish_port']
|
||||
return auth
|
||||
|
||||
def _finger_fail(self, finger, master_key):
|
||||
log.critical(
|
||||
'The specified fingerprint in the master configuration '
|
||||
'file:\n{0}\nDoes not match the authenticating master\'s '
|
||||
'key:\n{1}\nVerify that the configured fingerprint '
|
||||
'matches the fingerprint of the correct master and that '
|
||||
'this minion is not subject to a man-in-the-middle attack.'
|
||||
.format(
|
||||
finger,
|
||||
salt.utils.pem_finger(master_key, sum_type=self.opts['hash_type'])
|
||||
)
|
||||
)
|
||||
sys.exit(42)
|
||||
|
||||
|
||||
class Crypticle(object):
|
||||
'''
|
||||
|
|
|
@ -88,6 +88,7 @@ import salt.utils.jid
|
|||
import salt.pillar
|
||||
import salt.utils.args
|
||||
import salt.utils.event
|
||||
import salt.utils.minion
|
||||
import salt.utils.minions
|
||||
import salt.utils.schedule
|
||||
import salt.utils.error
|
||||
|
@ -1549,15 +1550,7 @@ class Minion(MinionBase):
|
|||
load['out'] = oput
|
||||
if self.opts['cache_jobs']:
|
||||
# Local job cache has been enabled
|
||||
fn_ = os.path.join(
|
||||
self.opts['cachedir'],
|
||||
'minion_jobs',
|
||||
load['jid'],
|
||||
'return.p')
|
||||
jdir = os.path.dirname(fn_)
|
||||
if not os.path.isdir(jdir):
|
||||
os.makedirs(jdir)
|
||||
salt.utils.fopen(fn_, 'w+b').write(self.serial.dumps(ret))
|
||||
salt.utils.minion.cache_jobs(self.opts, load['jid'], ret)
|
||||
|
||||
if not self.opts['pub_ret']:
|
||||
return ''
|
||||
|
|
|
@ -85,12 +85,24 @@ def recv(files, dest):
|
|||
def _mk_client():
|
||||
'''
|
||||
Create a file client and add it to the context.
|
||||
|
||||
Each file client needs to correspond to a unique copy
|
||||
of the opts dictionary, therefore it's hashed by the
|
||||
id of the __opts__ dict
|
||||
'''
|
||||
if 'cp.fileclient' not in __context__:
|
||||
__context__['cp.fileclient'] = \
|
||||
if 'cp.fileclient_{0}'.format(id(__opts__)) not in __context__:
|
||||
__context__['cp.fileclient_{0}'.format(id(__opts__))] = \
|
||||
salt.fileclient.get_file_client(__opts__)
|
||||
|
||||
|
||||
def _client():
|
||||
'''
|
||||
Return a client, hashed by the list of masters
|
||||
'''
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient_{0}'.format(id(__opts__))]
|
||||
|
||||
|
||||
def _render_filenames(path, dest, saltenv, template, **kw):
|
||||
'''
|
||||
Process markup in the :param:`path` and :param:`dest` variables (NOT the
|
||||
|
@ -202,8 +214,7 @@ def get_file(path,
|
|||
if not hash_file(path, saltenv):
|
||||
return ''
|
||||
else:
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].get_file(
|
||||
return _client().get_file(
|
||||
path,
|
||||
dest,
|
||||
makedirs,
|
||||
|
@ -238,7 +249,6 @@ def get_template(path,
|
|||
# Backwards compatibility
|
||||
saltenv = env
|
||||
|
||||
_mk_client()
|
||||
if 'salt' not in kwargs:
|
||||
kwargs['salt'] = __salt__
|
||||
if 'pillar' not in kwargs:
|
||||
|
@ -247,7 +257,7 @@ def get_template(path,
|
|||
kwargs['grains'] = __grains__
|
||||
if 'opts' not in kwargs:
|
||||
kwargs['opts'] = __opts__
|
||||
return __context__['cp.fileclient'].get_template(
|
||||
return _client().get_template(
|
||||
path,
|
||||
dest,
|
||||
template,
|
||||
|
@ -279,8 +289,7 @@ def get_dir(path, dest, saltenv='base', template=None, gzip=None, env=None, **kw
|
|||
|
||||
(path, dest) = _render_filenames(path, dest, saltenv, template, **kwargs)
|
||||
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].get_dir(path, dest, saltenv, gzip)
|
||||
return _client().get_dir(path, dest, saltenv, gzip)
|
||||
|
||||
|
||||
def get_url(path, dest, saltenv='base', env=None):
|
||||
|
@ -307,11 +316,10 @@ def get_url(path, dest, saltenv='base', env=None):
|
|||
# Backwards compatibility
|
||||
saltenv = env
|
||||
|
||||
_mk_client()
|
||||
if dest:
|
||||
return __context__['cp.fileclient'].get_url(path, dest, False, saltenv)
|
||||
return _client().get_url(path, dest, False, saltenv)
|
||||
else:
|
||||
return __context__['cp.fileclient'].get_url(path, None, False, saltenv, no_cache=True)
|
||||
return _client().get_url(path, None, False, saltenv, no_cache=True)
|
||||
|
||||
|
||||
def get_file_str(path, saltenv='base', env=None):
|
||||
|
@ -378,13 +386,11 @@ def cache_file(path, saltenv='base', env=None):
|
|||
except AttributeError:
|
||||
pass
|
||||
|
||||
_mk_client()
|
||||
|
||||
path, senv = salt.utils.url.split_env(path)
|
||||
if senv:
|
||||
saltenv = senv
|
||||
|
||||
result = __context__['cp.fileclient'].cache_file(path, saltenv)
|
||||
result = _client().cache_file(path, saltenv)
|
||||
if not result:
|
||||
log.error(
|
||||
'Unable to cache file \'{0}\' from saltenv \'{1}\'.'.format(
|
||||
|
@ -419,8 +425,7 @@ def cache_files(paths, saltenv='base', env=None):
|
|||
# Backwards compatibility
|
||||
saltenv = env
|
||||
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].cache_files(paths, saltenv)
|
||||
return _client().cache_files(paths, saltenv)
|
||||
|
||||
|
||||
def cache_dir(path, saltenv='base', include_empty=False, include_pat=None,
|
||||
|
@ -465,8 +470,7 @@ def cache_dir(path, saltenv='base', include_empty=False, include_pat=None,
|
|||
# Backwards compatibility
|
||||
saltenv = env
|
||||
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].cache_dir(
|
||||
return _client().cache_dir(
|
||||
path, saltenv, include_empty, include_pat, exclude_pat
|
||||
)
|
||||
|
||||
|
@ -490,8 +494,7 @@ def cache_master(saltenv='base', env=None):
|
|||
# Backwards compatibility
|
||||
saltenv = env
|
||||
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].cache_master(saltenv)
|
||||
return _client().cache_master(saltenv)
|
||||
|
||||
|
||||
def cache_local_file(path):
|
||||
|
@ -518,8 +521,7 @@ def cache_local_file(path):
|
|||
return path_cached
|
||||
|
||||
# The file hasn't been cached or has changed; cache it
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].cache_local_file(path)
|
||||
return _client().cache_local_file(path)
|
||||
|
||||
|
||||
def list_states(saltenv='base', env=None):
|
||||
|
@ -541,8 +543,7 @@ def list_states(saltenv='base', env=None):
|
|||
# Backwards compatibility
|
||||
saltenv = env
|
||||
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].list_states(saltenv)
|
||||
return _client().list_states(saltenv)
|
||||
|
||||
|
||||
def list_master(saltenv='base', prefix='', env=None):
|
||||
|
@ -564,8 +565,7 @@ def list_master(saltenv='base', prefix='', env=None):
|
|||
# Backwards compatibility
|
||||
saltenv = env
|
||||
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].file_list(saltenv, prefix)
|
||||
return _client().file_list(saltenv, prefix)
|
||||
|
||||
|
||||
def list_master_dirs(saltenv='base', prefix='', env=None):
|
||||
|
@ -587,8 +587,7 @@ def list_master_dirs(saltenv='base', prefix='', env=None):
|
|||
# Backwards compatibility
|
||||
saltenv = env
|
||||
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].dir_list(saltenv, prefix)
|
||||
return _client().dir_list(saltenv, prefix)
|
||||
|
||||
|
||||
def list_master_symlinks(saltenv='base', prefix='', env=None):
|
||||
|
@ -610,8 +609,7 @@ def list_master_symlinks(saltenv='base', prefix='', env=None):
|
|||
# Backwards compatibility
|
||||
saltenv = env
|
||||
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].symlink_list(saltenv, prefix)
|
||||
return _client().symlink_list(saltenv, prefix)
|
||||
|
||||
|
||||
def list_minion(saltenv='base', env=None):
|
||||
|
@ -633,8 +631,7 @@ def list_minion(saltenv='base', env=None):
|
|||
# Backwards compatibility
|
||||
saltenv = env
|
||||
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].file_local_list(saltenv)
|
||||
return _client().file_local_list(saltenv)
|
||||
|
||||
|
||||
def is_cached(path, saltenv='base', env=None):
|
||||
|
@ -657,8 +654,7 @@ def is_cached(path, saltenv='base', env=None):
|
|||
# Backwards compatibility
|
||||
saltenv = env
|
||||
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].is_cached(path, saltenv)
|
||||
return _client().is_cached(path, saltenv)
|
||||
|
||||
|
||||
def hash_file(path, saltenv='base', env=None):
|
||||
|
@ -686,8 +682,7 @@ def hash_file(path, saltenv='base', env=None):
|
|||
if senv:
|
||||
saltenv = senv
|
||||
|
||||
_mk_client()
|
||||
return __context__['cp.fileclient'].hash_file(path, saltenv)
|
||||
return _client().hash_file(path, saltenv)
|
||||
|
||||
|
||||
def push(path, keep_symlinks=False, upload_path=None, remove_source=False):
|
||||
|
|
|
@ -49,7 +49,7 @@ def _check_valid_version():
|
|||
'''
|
||||
# pylint: disable=no-member
|
||||
npm_version = distutils.version.LooseVersion(
|
||||
salt.modules.cmdmod.run('npm --version', python_shell=True))
|
||||
salt.modules.cmdmod.run('npm --version', output_loglevel='quiet'))
|
||||
valid_version = distutils.version.LooseVersion('1.2')
|
||||
# pylint: enable=no-member
|
||||
if npm_version < valid_version:
|
||||
|
|
|
@ -571,7 +571,7 @@ def assertion(assertion):
|
|||
|
||||
.. code-block:: bash
|
||||
|
||||
salt '*' test.assert False
|
||||
salt '*' test.assertion False
|
||||
'''
|
||||
assert assertion
|
||||
|
||||
|
|
|
@ -155,10 +155,9 @@ def add(name,
|
|||
if 'group' not in line[:5]:
|
||||
continue
|
||||
|
||||
for val in line.split(' '):
|
||||
cmd.extend([
|
||||
'-g', str(val[1])
|
||||
])
|
||||
cmd.extend([
|
||||
'-g', str(line.split()[-1])
|
||||
])
|
||||
|
||||
# We found what we wanted, let's break out of the loop
|
||||
break
|
||||
|
|
|
@ -26,12 +26,17 @@ def __virtual__():
|
|||
Load only on windows with servermanager module
|
||||
'''
|
||||
if not salt.utils.is_windows():
|
||||
return False, 'Failed to load win_servermanager module:\n' \
|
||||
return False, 'Failed to load win_servermanager module: ' \
|
||||
'Only available on Windows systems.'
|
||||
|
||||
if salt.utils.version_cmp(__grains__['osversion'], '6.1.7600') == -1:
|
||||
return False, 'Failed to load win_servermanager module: ' \
|
||||
'Requires Remote Server Administration Tools which ' \
|
||||
'is only available on Windows 2008 R2 and later.'
|
||||
|
||||
if not _check_server_manager():
|
||||
return False, 'Failed to load win_servermanager module:\n' \
|
||||
'ServerManager module not available.\n' \
|
||||
return False, 'Failed to load win_servermanager module: ' \
|
||||
'ServerManager module not available. ' \
|
||||
'May need to install Remote Server Administration Tools.'
|
||||
|
||||
return __virtualname__
|
||||
|
@ -53,8 +58,9 @@ def _pshell_json(cmd, cwd=None):
|
|||
Execute the desired powershell command and ensure that it returns data
|
||||
in json format and load that into python
|
||||
'''
|
||||
cmd = 'Import-Module ServerManager; {0}'.format(cmd)
|
||||
if 'convertto-json' not in cmd.lower():
|
||||
cmd = ' '.join([cmd, '| ConvertTo-Json'])
|
||||
cmd = '{0} | ConvertTo-Json'.format(cmd)
|
||||
log.debug('PowerShell: {0}'.format(cmd))
|
||||
ret = __salt__['cmd.shell'](cmd, shell='powershell', cwd=cwd)
|
||||
try:
|
||||
|
@ -77,7 +83,8 @@ def list_available():
|
|||
|
||||
salt '*' win_servermanager.list_available
|
||||
'''
|
||||
cmd = 'Get-WindowsFeature -erroraction silentlycontinue ' \
|
||||
cmd = 'Import-Module ServerManager; ' \
|
||||
'Get-WindowsFeature -erroraction silentlycontinue ' \
|
||||
'-warningaction silentlycontinue'
|
||||
return __salt__['cmd.shell'](cmd, shell='powershell')
|
||||
|
||||
|
|
|
@ -609,12 +609,14 @@ def _get_repo_info(alias, repos_cfg=None):
|
|||
Get one repo meta-data.
|
||||
'''
|
||||
try:
|
||||
ret = dict((repos_cfg or _get_configured_repos()).items(alias))
|
||||
ret['alias'] = alias
|
||||
for key, val in six.iteritems(ret):
|
||||
if val == 'NONE':
|
||||
ret[key] = None
|
||||
return ret
|
||||
meta = dict((repos_cfg or _get_configured_repos()).items(alias))
|
||||
meta['alias'] = alias
|
||||
for key, val in six.iteritems(meta):
|
||||
if val in ['0', '1']:
|
||||
meta[key] = int(meta[key]) == 1
|
||||
elif val == 'NONE':
|
||||
meta[key] = None
|
||||
return meta
|
||||
except (ValueError, configparser.NoSectionError):
|
||||
return {}
|
||||
|
||||
|
@ -786,7 +788,7 @@ def mod_repo(repo, **kwargs):
|
|||
cmd_opt.append('--gpg-auto-import-keys')
|
||||
|
||||
if 'priority' in kwargs:
|
||||
cmd_opt.append("--priority='{0}'".format(kwargs.get('priority', DEFAULT_PRIORITY)))
|
||||
cmd_opt.append("--priority={0}".format(kwargs.get('priority', DEFAULT_PRIORITY)))
|
||||
|
||||
if 'humanname' in kwargs:
|
||||
cmd_opt.append("--name='{0}'".format(kwargs.get('humanname')))
|
||||
|
|
|
@ -139,9 +139,10 @@ class Serial(object):
|
|||
if six.PY3 and encoding is None and not raw:
|
||||
ret = salt.transport.frame.decode_embedded_strs(ret)
|
||||
except Exception as exc:
|
||||
log.critical('Could not deserialize msgpack message: {0}'
|
||||
'This often happens when trying to read a file not in binary mode.'
|
||||
'Please open an issue and include the following error: {1}'.format(msg, exc))
|
||||
log.critical('Could not deserialize msgpack message.'
|
||||
'This often happens when trying to read a file not in binary mode'
|
||||
'To see message payload, enable debug logging and retry. Exception: {0}'.format(exc))
|
||||
log.debug('Msgpack deserialization failure on message: {0}'.format(msg))
|
||||
raise
|
||||
finally:
|
||||
gc.enable()
|
||||
|
|
|
@ -21,6 +21,7 @@ requisite to a pkg.installed state for the package which provides pip
|
|||
|
||||
# Import python libs
|
||||
from __future__ import absolute_import
|
||||
import re
|
||||
import logging
|
||||
|
||||
# Import salt libs
|
||||
|
@ -166,8 +167,12 @@ def _check_pkg_version_format(pkg):
|
|||
ret['version_spec'] = []
|
||||
else:
|
||||
ret['result'] = True
|
||||
ret['prefix'] = install_req.req.project_name
|
||||
ret['version_spec'] = install_req.req.specs
|
||||
ret['prefix'] = re.sub('[^A-Za-z0-9.]+', '-', install_req.name)
|
||||
if hasattr(install_req, "specifier"):
|
||||
specifier = install_req.specifier
|
||||
else:
|
||||
specifier = install_req.req.specifier
|
||||
ret['version_spec'] = [(spec.operator, spec.version) for spec in specifier]
|
||||
|
||||
return ret
|
||||
|
||||
|
|
|
@ -487,13 +487,13 @@ def _find_install_targets(name=None,
|
|||
if verify_result:
|
||||
to_reinstall[key] = val
|
||||
altered_files[key] = verify_result
|
||||
else:
|
||||
log.debug(
|
||||
'Current version ({0}) did not match desired version '
|
||||
'specification ({1}), adding to installation targets'
|
||||
.format(cver, val)
|
||||
)
|
||||
targets[key] = val
|
||||
else:
|
||||
log.debug(
|
||||
'Current version ({0}) did not match desired version '
|
||||
'specification ({1}), adding to installation targets'
|
||||
.format(cver, val)
|
||||
)
|
||||
targets[key] = val
|
||||
|
||||
if problems:
|
||||
return {'name': name,
|
||||
|
|
|
@ -619,6 +619,7 @@ def wait_for_port(host, port=22, timeout=900, gateway=None):
|
|||
# we first want to test the gateway before the host.
|
||||
test_ssh_host = host
|
||||
test_ssh_port = port
|
||||
|
||||
if gateway:
|
||||
ssh_gateway = gateway['ssh_gateway']
|
||||
ssh_gateway_port = 22
|
||||
|
@ -644,7 +645,10 @@ def wait_for_port(host, port=22, timeout=900, gateway=None):
|
|||
while True:
|
||||
trycount += 1
|
||||
try:
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
if socket.inet_pton(socket.AF_INET6, host):
|
||||
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
|
||||
else:
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.settimeout(30)
|
||||
sock.connect((test_ssh_host, int(test_ssh_port)))
|
||||
# Stop any remaining reads/writes on the socket
|
||||
|
@ -1861,11 +1865,17 @@ def scp_file(dest_path, contents=None, kwargs=None, local_file=None):
|
|||
ssh_gateway_port
|
||||
)
|
||||
)
|
||||
|
||||
if socket.inet_pton(socket.AF_INET6, kwargs['hostname']):
|
||||
ipaddr = '[{0}]'.format(kwargs['hostname'])
|
||||
else:
|
||||
ipaddr = kwargs['hostname']
|
||||
|
||||
cmd = (
|
||||
'scp {0} {1} {2[username]}@{2[hostname]}:{3} || '
|
||||
'echo "put {1} {3}" | sftp {0} {2[username]}@{2[hostname]} || '
|
||||
'scp {0} {1} {2[username]}@{4}:{3} || '
|
||||
'echo "put {1} {3}" | sftp {0} {2[username]}@{4} || '
|
||||
'rsync -avz -e "ssh {0}" {1} {2[username]}@{2[hostname]}:{3}'.format(
|
||||
' '.join(ssh_args), tmppath, kwargs, dest_path
|
||||
' '.join(ssh_args), tmppath, kwargs, dest_path, ipaddr
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -1965,8 +1975,13 @@ def sftp_file(dest_path, contents=None, kwargs=None, local_file=None):
|
|||
)
|
||||
)
|
||||
|
||||
cmd = 'echo "put {0} {1} {2}" | sftp {3} {4[username]}@{4[hostname]}'.format(
|
||||
' '.join(put_args), tmppath, dest_path, ' '.join(ssh_args), kwargs
|
||||
if socket.inet_pton(socket.AF_INET6, kwargs['hostname']):
|
||||
ipaddr = '[{0}]'.format(kwargs['hostname'])
|
||||
else:
|
||||
ipaddr = kwargs['hostname']
|
||||
|
||||
cmd = 'echo "put {0} {1} {2}" | sftp {3} {4[username]}@{5}'.format(
|
||||
' '.join(put_args), tmppath, dest_path, ' '.join(ssh_args), kwargs, ipaddr
|
||||
)
|
||||
log.debug('SFTP command: \'{0}\''.format(cmd))
|
||||
retcode = _exec_ssh_cmd(cmd,
|
||||
|
|
|
@ -44,20 +44,17 @@ AUTH_PARAMS = ('user', 'password', 'pubkey', 'privkey', 'passphrase',
|
|||
|
||||
_RECOMMEND_GITPYTHON = (
|
||||
'GitPython is installed, you may wish to set {0}_provider to '
|
||||
'\'gitpython\' in the master config file to use GitPython for {0} '
|
||||
'support.'
|
||||
'\'gitpython\' to use GitPython for {0} support.'
|
||||
)
|
||||
|
||||
_RECOMMEND_PYGIT2 = (
|
||||
'pygit2 is installed, you may wish to set {0}_provider to '
|
||||
'\'pygit2\' in the master config file to use pygit2 for for {0} '
|
||||
'support.'
|
||||
'\'pygit2\' to use pygit2 for for {0} support.'
|
||||
)
|
||||
|
||||
_RECOMMEND_DULWICH = (
|
||||
'Dulwich is installed, you may wish to set {0}_provider to '
|
||||
'\'dulwich\' in the master config file to use Dulwich for {0} '
|
||||
'support.'
|
||||
'\'dulwich\' to use Dulwich for {0} support.'
|
||||
)
|
||||
|
||||
_INVALID_REPO = (
|
||||
|
@ -2280,15 +2277,15 @@ class GitBase(object):
|
|||
'''
|
||||
def _recommend():
|
||||
if HAS_PYGIT2 and 'pygit2' in self.valid_providers:
|
||||
log.error(_RECOMMEND_PYGIT2)
|
||||
log.error(_RECOMMEND_PYGIT2.format(self.role))
|
||||
if HAS_DULWICH and 'dulwich' in self.valid_providers:
|
||||
log.error(_RECOMMEND_DULWICH)
|
||||
log.error(_RECOMMEND_DULWICH.format(self.role))
|
||||
|
||||
if not HAS_GITPYTHON:
|
||||
if not quiet:
|
||||
log.error(
|
||||
'Git fileserver backend is enabled in master config file, '
|
||||
'but could not be loaded, is GitPython installed?'
|
||||
'%s is configured but could not be loaded, is GitPython '
|
||||
'installed?', self.role
|
||||
)
|
||||
_recommend()
|
||||
return False
|
||||
|
@ -2302,14 +2299,17 @@ class GitBase(object):
|
|||
errors = []
|
||||
if gitver < minver:
|
||||
errors.append(
|
||||
'Git fileserver backend is enabled in master config file, but '
|
||||
'the GitPython version is earlier than {0}. Version {1} '
|
||||
'detected.'.format(GITPYTHON_MINVER, git.__version__)
|
||||
'{0} is configured, but the GitPython version is earlier than '
|
||||
'{1}. Version {2} detected.'.format(
|
||||
self.role,
|
||||
GITPYTHON_MINVER,
|
||||
git.__version__
|
||||
)
|
||||
)
|
||||
if not salt.utils.which('git'):
|
||||
errors.append(
|
||||
'The git command line utility is required by the Git fileserver '
|
||||
'backend when using the \'gitpython\' provider.'
|
||||
'The git command line utility is required when using the '
|
||||
'\'gitpython\' {0}_provider.'.format(self.role)
|
||||
)
|
||||
|
||||
if errors:
|
||||
|
@ -2330,16 +2330,15 @@ class GitBase(object):
|
|||
'''
|
||||
def _recommend():
|
||||
if HAS_GITPYTHON and 'gitpython' in self.valid_providers:
|
||||
log.error(_RECOMMEND_GITPYTHON)
|
||||
log.error(_RECOMMEND_GITPYTHON.format(self.role))
|
||||
if HAS_DULWICH and 'dulwich' in self.valid_providers:
|
||||
log.error(_RECOMMEND_DULWICH)
|
||||
log.error(_RECOMMEND_DULWICH.format(self.role))
|
||||
|
||||
if not HAS_PYGIT2:
|
||||
if not quiet:
|
||||
log.error(
|
||||
'Git fileserver backend is enabled in master config file, '
|
||||
'but could not be loaded, are pygit2 and libgit2 '
|
||||
'installed?'
|
||||
'%s is configured but could not be loaded, are pygit2 '
|
||||
'and libgit2 installed?', self.role
|
||||
)
|
||||
_recommend()
|
||||
return False
|
||||
|
@ -2357,20 +2356,26 @@ class GitBase(object):
|
|||
errors = []
|
||||
if pygit2ver < pygit2_minver:
|
||||
errors.append(
|
||||
'Git fileserver backend is enabled in master config file, but '
|
||||
'pygit2 version is earlier than {0}. Version {1} detected.'
|
||||
.format(PYGIT2_MINVER, pygit2.__version__)
|
||||
'{0} is configured, but the pygit2 version is earlier than '
|
||||
'{1}. Version {2} detected.'.format(
|
||||
self.role,
|
||||
PYGIT2_MINVER,
|
||||
pygit2.__version__
|
||||
)
|
||||
)
|
||||
if libgit2ver < libgit2_minver:
|
||||
errors.append(
|
||||
'Git fileserver backend is enabled in master config file, but '
|
||||
'libgit2 version is earlier than {0}. Version {1} detected.'
|
||||
.format(LIBGIT2_MINVER, pygit2.LIBGIT2_VERSION)
|
||||
'{0} is configured, but the libgit2 version is earlier than '
|
||||
'{1}. Version {2} detected.'.format(
|
||||
self.role,
|
||||
LIBGIT2_MINVER,
|
||||
pygit2.LIBGIT2_VERSION
|
||||
)
|
||||
)
|
||||
if not salt.utils.which('git'):
|
||||
errors.append(
|
||||
'The git command line utility is required by the Git fileserver '
|
||||
'backend when using the \'pygit2\' provider.'
|
||||
'The git command line utility is required when using the '
|
||||
'\'pygit2\' {0}_provider.'.format(self.role)
|
||||
)
|
||||
|
||||
if errors:
|
||||
|
@ -2390,15 +2395,15 @@ class GitBase(object):
|
|||
'''
|
||||
def _recommend():
|
||||
if HAS_GITPYTHON and 'gitpython' in self.valid_providers:
|
||||
log.error(_RECOMMEND_GITPYTHON)
|
||||
log.error(_RECOMMEND_GITPYTHON.format(self.role))
|
||||
if HAS_PYGIT2 and 'pygit2' in self.valid_providers:
|
||||
log.error(_RECOMMEND_PYGIT2)
|
||||
log.error(_RECOMMEND_PYGIT2.format(self.role))
|
||||
|
||||
if not HAS_DULWICH:
|
||||
if not quiet:
|
||||
log.error(
|
||||
'Git fileserver backend is enabled in the master config file, but '
|
||||
'could not be loaded. Is Dulwich installed?'
|
||||
'%s is configured but could not be loaded. Is Dulwich '
|
||||
'installed?', self.role
|
||||
)
|
||||
_recommend()
|
||||
return False
|
||||
|
@ -2409,9 +2414,12 @@ class GitBase(object):
|
|||
|
||||
if dulwich.__version__ < DULWICH_MINVER:
|
||||
errors.append(
|
||||
'Git fileserver backend is enabled in the master config file, but '
|
||||
'the installed version of Dulwich is earlier than {0}. Version {1} '
|
||||
'detected.'.format(DULWICH_MINVER, dulwich.__version__)
|
||||
'{0} is configured, but the installed version of Dulwich is '
|
||||
'earlier than {1}. Version {2} detected.'.format(
|
||||
self.role,
|
||||
DULWICH_MINVER,
|
||||
dulwich.__version__
|
||||
)
|
||||
)
|
||||
|
||||
if errors:
|
||||
|
|
|
@ -2,11 +2,13 @@
|
|||
'''
|
||||
Utility functions for minions
|
||||
'''
|
||||
# Import python libs
|
||||
|
||||
# Import Python Libs
|
||||
from __future__ import absolute_import
|
||||
import os
|
||||
import threading
|
||||
# Import salt libs
|
||||
|
||||
# Import Salt Libs
|
||||
import salt.utils
|
||||
import salt.payload
|
||||
|
||||
|
@ -33,6 +35,20 @@ def running(opts):
|
|||
return ret
|
||||
|
||||
|
||||
def cache_jobs(opts, jid, ret):
|
||||
serial = salt.payload.Serial(opts=opts)
|
||||
|
||||
fn_ = os.path.join(
|
||||
opts['cachedir'],
|
||||
'minion_jobs',
|
||||
jid,
|
||||
'return.p')
|
||||
jdir = os.path.dirname(fn_)
|
||||
if not os.path.isdir(jdir):
|
||||
os.makedirs(jdir)
|
||||
salt.utils.fopen(fn_, 'w+b').write(serial.dumps(ret))
|
||||
|
||||
|
||||
def _read_proc_file(path, opts):
|
||||
'''
|
||||
Return a dict of JID metadata, or None
|
||||
|
|
|
@ -234,6 +234,8 @@ def build_centos(opts):
|
|||
if major_release == 5:
|
||||
python_bin = 'python26'
|
||||
define_opts.extend(['--define', 'dist .el5'])
|
||||
if os.path.exists('/etc/yum.repos.d/saltstack.repo'):
|
||||
build_reqs.extend(['--enablerepo=saltstack'])
|
||||
build_reqs.extend(['python26-devel'])
|
||||
elif major_release == 6:
|
||||
build_reqs.extend(['python-devel'])
|
||||
|
|
|
@ -113,6 +113,17 @@ class PillarModuleTest(integration.ModuleCase):
|
|||
|
||||
self.assertEqual(grepo.rp_location, repo.remotes.origin.url)
|
||||
|
||||
def test_pillar_items(self):
|
||||
'''
|
||||
Test to ensure we get expected output
|
||||
from pillar.items
|
||||
'''
|
||||
get_items = self.run_function('pillar.items')
|
||||
self.assertDictContainsSubset({'info': 'bar'}, get_items)
|
||||
self.assertDictContainsSubset({'monty': 'python'}, get_items)
|
||||
self.assertDictContainsSubset(
|
||||
{'knights': ['Lancelot', 'Galahad', 'Bedevere', 'Robin']},
|
||||
get_items)
|
||||
|
||||
if __name__ == '__main__':
|
||||
from integration import run_tests
|
||||
|
|
|
@ -15,6 +15,7 @@ import re
|
|||
import shutil
|
||||
import yaml
|
||||
from datetime import datetime
|
||||
import logging
|
||||
|
||||
# Import Salt Testing libs
|
||||
from salttesting import skipIf
|
||||
|
@ -24,6 +25,19 @@ ensure_in_syspath('../../')
|
|||
# Import salt libs
|
||||
import integration
|
||||
import salt.utils
|
||||
from salttesting.helpers import (
|
||||
destructiveTest
|
||||
)
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
_PKG_TARGETS = {
|
||||
'Arch': ['python2-django', 'libpng'],
|
||||
'Debian': ['python-plist', 'apg'],
|
||||
'RedHat': ['xz-devel', 'zsh-html'],
|
||||
'FreeBSD': ['aalib', 'pth'],
|
||||
'Suse': ['aalib', 'python-pssh']
|
||||
}
|
||||
|
||||
|
||||
class CallTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn):
|
||||
|
@ -67,6 +81,26 @@ class CallTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn):
|
|||
self.assertIn('hello', ''.join(out))
|
||||
self.assertIn('Succeeded: 1', ''.join(out))
|
||||
|
||||
@destructiveTest
|
||||
@skipIf(True, 'Skipping due to off the wall failures and hangs on most os\'s. Will re-enable when fixed.')
|
||||
@skipIf(sys.platform.startswith('win'), 'This test does not apply on Win')
|
||||
def test_local_pkg_install(self):
|
||||
'''
|
||||
Test to ensure correct output when installing package
|
||||
'''
|
||||
get_os_family = self.run_call('--local grains.get os_family')
|
||||
pkg_targets = _PKG_TARGETS.get(get_os_family[1].strip(), [])
|
||||
check_pkg = self.run_call('--local pkg.list_pkgs')
|
||||
for pkg in pkg_targets:
|
||||
if pkg not in str(check_pkg):
|
||||
out = self.run_call('--local pkg.install {0}'.format(pkg))
|
||||
self.assertIn('local: ----------', ''.join(out))
|
||||
self.assertIn('{0}: ----------'.format(pkg), ''.join(out))
|
||||
self.assertIn('new:', ''.join(out))
|
||||
self.assertIn('old:', ''.join(out))
|
||||
else:
|
||||
log.debug('The pkg: {0} is already installed on the machine'.format(pkg))
|
||||
|
||||
@skipIf(sys.platform.startswith('win'), 'This test does not apply on Win')
|
||||
def test_user_delete_kw_output(self):
|
||||
ret = self.run_call('-l quiet -d user.delete')
|
||||
|
@ -391,6 +425,17 @@ class CallTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn):
|
|||
# Restore umask
|
||||
os.umask(current_umask)
|
||||
|
||||
def tearDown(self):
|
||||
'''
|
||||
Teardown method to remove installed packages
|
||||
'''
|
||||
check_pkg = self.run_call('--local pkg.list_pkgs')
|
||||
get_os_family = self.run_call('--local grains.get os_family')
|
||||
pkg_targets = _PKG_TARGETS.get(get_os_family[1].strip(), [])
|
||||
check_pkg = self.run_call('--local pkg.list_pkgs')
|
||||
for pkg in pkg_targets:
|
||||
if pkg in str(check_pkg):
|
||||
out = self.run_call('--local pkg.remove {0}'.format(pkg))
|
||||
|
||||
if __name__ == '__main__':
|
||||
from integration import run_tests
|
||||
|
|
|
@ -38,30 +38,6 @@ class CpTestCase(TestCase):
|
|||
TestCase for salt.modules.cp module
|
||||
'''
|
||||
|
||||
@patch('os.path.isdir', MagicMock(return_value=False))
|
||||
def test_recv_return_unavailable(self):
|
||||
'''
|
||||
Test if recv returns unavailable.
|
||||
'''
|
||||
files = {'saltines': '/srv/salt/saltines',
|
||||
'biscuits': '/srv/salt/biscuits'}
|
||||
dest = '/srv/salt/cheese'
|
||||
self.assertEqual(cp.recv(files, dest), 'Destination unavailable')
|
||||
|
||||
@patch('os.path.isdir', MagicMock(return_value=True))
|
||||
def test_recv_return_success(self):
|
||||
'''
|
||||
Test if recv returns success.
|
||||
'''
|
||||
files = {'saltines': 'salt://saltines',
|
||||
'biscuits': 'salt://biscuits'}
|
||||
ret = {'/srv/salt/cheese/saltines': True,
|
||||
'/srv/salt/cheese/biscuits': True}
|
||||
dest = '/srv/salt/cheese'
|
||||
file_data = 'Remember to keep your files well salted.'
|
||||
with patch('salt.utils.fopen', mock_open(read_data=file_data)):
|
||||
self.assertEqual(cp.recv(files, dest), ret)
|
||||
|
||||
def test__render_filenames_undefined_template(self):
|
||||
'''
|
||||
Test if _render_filenames fails upon getting a template not in
|
||||
|
@ -122,79 +98,6 @@ class CpTestCase(TestCase):
|
|||
ret = ''
|
||||
self.assertEqual(cp.get_file(path, dest), ret)
|
||||
|
||||
@patch('salt.modules.cp.hash_file', MagicMock(return_value=True))
|
||||
def test_get_file_success(self):
|
||||
'''
|
||||
Test if get_file succeeds.
|
||||
'''
|
||||
path = 'salt://saltines'
|
||||
dest = '/srv/salt/cheese'
|
||||
saltenv = 'base'
|
||||
ret = (path, dest, False, saltenv, None)
|
||||
|
||||
class MockFileClient(object):
|
||||
def get_file(self, *args):
|
||||
return args
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.get_file(path, dest), ret)
|
||||
|
||||
def test_get_template_success(self):
|
||||
'''
|
||||
Test if get_template succeeds.
|
||||
'''
|
||||
path = 'salt://saltines'
|
||||
dest = '/srv/salt/cheese'
|
||||
template = 'jinja'
|
||||
saltenv = 'base'
|
||||
ret = ((path, dest, template, False, saltenv),
|
||||
{'grains': {}, 'opts': {}, 'pillar': {}, 'salt': {}})
|
||||
|
||||
class MockFileClient(object):
|
||||
def get_template(self, *args, **kwargs):
|
||||
return args, kwargs
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.get_template(path, dest), ret)
|
||||
|
||||
def test_get_dir_success(self):
|
||||
'''
|
||||
Test if get_template succeeds.
|
||||
'''
|
||||
path = 'salt://saltines'
|
||||
dest = '/srv/salt/cheese'
|
||||
saltenv = 'base'
|
||||
ret = (path, dest, saltenv, None)
|
||||
|
||||
class MockFileClient(object):
|
||||
def get_dir(self, *args):
|
||||
return args
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
with patch('salt.modules.cp._render_filenames',
|
||||
MagicMock(return_value=(path, dest))):
|
||||
self.assertEqual(cp.get_dir(path, dest), ret)
|
||||
|
||||
def test_get_url_success(self):
|
||||
'''
|
||||
Test if get_url succeeds.
|
||||
'''
|
||||
path = 'salt://saltines'
|
||||
dest = '/srv/salt/cheese'
|
||||
saltenv = 'base'
|
||||
ret = (path, dest, False, saltenv)
|
||||
|
||||
class MockFileClient(object):
|
||||
def get_url(self, *args):
|
||||
return args
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.get_url(path, dest), ret)
|
||||
|
||||
def test_get_file_str_success(self):
|
||||
'''
|
||||
Test if get_file_str succeeds.
|
||||
|
@ -209,210 +112,6 @@ class CpTestCase(TestCase):
|
|||
MagicMock(return_value=dest)):
|
||||
self.assertEqual(cp.get_file_str(path, dest), ret)
|
||||
|
||||
def test_cache_file_success(self):
|
||||
'''
|
||||
Test if cache_file succeeds.
|
||||
'''
|
||||
path = 'salt://saltines'
|
||||
saltenv = 'base'
|
||||
ret = path
|
||||
|
||||
class MockFileClient(object):
|
||||
def cache_file(self, path, saltenv):
|
||||
return path
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.cache_file(path), ret)
|
||||
|
||||
def test_cache_files_success(self):
|
||||
'''
|
||||
Test if cache_files succeeds.
|
||||
'''
|
||||
paths = ['salt://saltines', 'salt://biscuits']
|
||||
saltenv = 'base'
|
||||
ret = paths
|
||||
|
||||
class MockFileClient(object):
|
||||
def cache_files(self, paths, saltenv):
|
||||
return paths
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.cache_files(paths), ret)
|
||||
|
||||
def test_cache_dir_success(self):
|
||||
'''
|
||||
Test if cache_dir succeeds.
|
||||
'''
|
||||
path = 'saltk//cheese'
|
||||
files = ['/srv/salt/cheese/saltines', '/srv/salt/cheese/biscuits']
|
||||
saltenv = 'base'
|
||||
ret = files
|
||||
|
||||
class MockFileClient(object):
|
||||
def cache_dir(self, *args):
|
||||
return files
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.cache_dir(files), ret)
|
||||
|
||||
def test_cache_master_success(self):
|
||||
'''
|
||||
Test if cache_master succeeds.
|
||||
'''
|
||||
path = 'saltk//cheese'
|
||||
files = ['/srv/salt/cheese/saltines', '/srv/salt/cheese/biscuits']
|
||||
saltenv = 'base'
|
||||
ret = files
|
||||
|
||||
class MockFileClient(object):
|
||||
def cache_master(self, saltenv):
|
||||
return files
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.cache_master(), ret)
|
||||
|
||||
@patch('os.path.exists', MagicMock(return_value=False))
|
||||
def test_cache_local_file_not_exists(self):
|
||||
'''
|
||||
Test if cache_local_file handles a nonexistent file.
|
||||
'''
|
||||
path = 'saltk//saltines'
|
||||
ret = ''
|
||||
|
||||
self.assertEqual(cp.cache_local_file(path), ret)
|
||||
|
||||
@patch('os.path.exists', MagicMock(return_value=True))
|
||||
def test_cache_local_file_already_cached(self):
|
||||
'''
|
||||
Test if cache_local_file handles an already cached file.
|
||||
'''
|
||||
path = 'saltk//saltines'
|
||||
dest_file = '/srv/salt/cheese/saltines'
|
||||
mock_hash = {'hsum': 'deadbeef'}
|
||||
ret = dest_file
|
||||
|
||||
with patch('salt.modules.cp.hash_file',
|
||||
MagicMock(return_value=mock_hash)):
|
||||
with patch('salt.modules.cp.is_cached',
|
||||
MagicMock(return_value=dest_file)):
|
||||
self.assertEqual(cp.cache_local_file(path), ret)
|
||||
|
||||
@patch('os.path.exists', MagicMock(return_value=True))
|
||||
def test_cache_local_file_success(self):
|
||||
'''
|
||||
Test if cache_local_file succeeds.
|
||||
'''
|
||||
path = 'saltk//saltines'
|
||||
dest_file = '/srv/salt/cheese/saltines'
|
||||
ret = dest_file
|
||||
|
||||
class MockFileClient(object):
|
||||
def cache_local_file(self, path):
|
||||
return dest_file
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch('salt.modules.cp.is_cached',
|
||||
MagicMock(return_value=False)):
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.cache_local_file(path), ret)
|
||||
|
||||
def test_list_states_success(self):
|
||||
'''
|
||||
Test if list_states succeeds.
|
||||
'''
|
||||
states = ['cheesse.saltines', 'cheese.biscuits']
|
||||
ret = states
|
||||
|
||||
class MockFileClient(object):
|
||||
def list_states(self, saltenv):
|
||||
return states
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.list_states(), ret)
|
||||
|
||||
def test_list_master_success(self):
|
||||
'''
|
||||
Test if list_master succeeds.
|
||||
'''
|
||||
files = ['cheesse/saltines.sls', 'cheese/biscuits.sls']
|
||||
ret = files
|
||||
|
||||
class MockFileClient(object):
|
||||
def file_list(self, saltenv, prefix):
|
||||
return files
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.list_master(), ret)
|
||||
|
||||
def test_list_master_dirs_success(self):
|
||||
'''
|
||||
Test if list_master_dirs succeeds.
|
||||
'''
|
||||
dirs = ['cheesse', 'gravy']
|
||||
ret = dirs
|
||||
|
||||
class MockFileClient(object):
|
||||
def dir_list(self, saltenv, prefix):
|
||||
return dirs
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.list_master_dirs(), ret)
|
||||
|
||||
def test_list_master_symlinks_success(self):
|
||||
'''
|
||||
Test if list_master_symlinks succeeds.
|
||||
'''
|
||||
symlinks = ['american_cheesse', 'vegan_gravy']
|
||||
ret = symlinks
|
||||
|
||||
class MockFileClient(object):
|
||||
def symlink_list(self, saltenv, prefix):
|
||||
return symlinks
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.list_master_symlinks(), ret)
|
||||
|
||||
def test_is_cached_success(self):
|
||||
'''
|
||||
Test if is_cached succeeds.
|
||||
'''
|
||||
path = 'salt://saltines'
|
||||
ret = path
|
||||
|
||||
class MockFileClient(object):
|
||||
def is_cached(self, path, saltenv):
|
||||
return path
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
self.assertEqual(cp.is_cached(path), ret)
|
||||
|
||||
def test_hash_file_success(self):
|
||||
'''
|
||||
Test if hash_file succeeds.
|
||||
'''
|
||||
path = 'salt://saltines'
|
||||
mock_hash = {'hsum': 'deadbeef', 'htype': 'sha65536'}
|
||||
ret = mock_hash
|
||||
|
||||
class MockFileClient(object):
|
||||
def hash_file(self, path, saltenv):
|
||||
return mock_hash
|
||||
|
||||
mock_file_client = MockFileClient()
|
||||
with patch.dict(cp.__context__, {'cp.fileclient': mock_file_client}):
|
||||
with patch('salt.modules.cp.hash_file',
|
||||
MagicMock(return_value=mock_hash)):
|
||||
self.assertEqual(cp.hash_file(path), ret)
|
||||
|
||||
def test_push_non_absolute_path(self):
|
||||
'''
|
||||
Test if push fails on a non absolute path.
|
||||
|
@ -422,84 +121,6 @@ class CpTestCase(TestCase):
|
|||
|
||||
self.assertEqual(cp.push(path), ret)
|
||||
|
||||
@patch('os.path.isfile', MagicMock(return_value=False))
|
||||
def test_push_non_file(self):
|
||||
'''
|
||||
Test if push fails on a non file.
|
||||
'''
|
||||
path = '/srv/salt/saltines'
|
||||
ret = False
|
||||
|
||||
self.assertEqual(cp.push(path), ret)
|
||||
|
||||
@patch('os.path.isfile', MagicMock(return_value=True))
|
||||
def test_push_failed(self):
|
||||
'''
|
||||
Test if push fails.
|
||||
'''
|
||||
path = '/srv/salt/saltines'
|
||||
file_data = 'Remember to keep your files well salted.'
|
||||
mock_buf_size = len(file_data)
|
||||
mock_id = 'You don\'t need to see his identification.'
|
||||
ret = None
|
||||
|
||||
class MockChannel(object):
|
||||
@staticmethod
|
||||
def factory(__opts__):
|
||||
return MockChannel()
|
||||
|
||||
def send(self, load):
|
||||
return None
|
||||
|
||||
class MockAuth(object):
|
||||
def gen_token(self, salt):
|
||||
return 'token info'
|
||||
|
||||
def mock_auth_factory():
|
||||
return MockAuth()
|
||||
|
||||
with patch('salt.transport.Channel', MockChannel):
|
||||
with patch('salt.modules.cp._auth', mock_auth_factory):
|
||||
with patch('salt.utils.fopen', mock_open(read_data=file_data)):
|
||||
with patch.dict(cp.__opts__,
|
||||
{'file_buffer_size': mock_buf_size,
|
||||
'id': mock_id}):
|
||||
self.assertEqual(cp.push(path), ret)
|
||||
|
||||
@patch('os.path.isfile', MagicMock(return_value=True))
|
||||
def test_push_success(self):
|
||||
'''
|
||||
Test if push succeeds.
|
||||
'''
|
||||
path = '/srv/salt/saltines'
|
||||
file_data = ''
|
||||
mock_buf_size = len(file_data)
|
||||
mock_id = 'You don\'t need to see his identification.'
|
||||
ret = True
|
||||
|
||||
class MockChannel(object):
|
||||
@staticmethod
|
||||
def factory(__opts__):
|
||||
return MockChannel()
|
||||
|
||||
def send(self, load):
|
||||
return 'channel info'
|
||||
|
||||
class MockAuth(object):
|
||||
def gen_token(self, salt):
|
||||
return 'token info'
|
||||
|
||||
def mock_auth_factory():
|
||||
return MockAuth()
|
||||
|
||||
with patch('salt.transport.Channel', MockChannel):
|
||||
with patch('salt.modules.cp._auth', mock_auth_factory):
|
||||
with patch('salt.utils.fopen', mock_open(read_data=file_data)):
|
||||
with patch.dict(cp.__opts__,
|
||||
{'file_buffer_size': mock_buf_size,
|
||||
'id': mock_id}):
|
||||
self.assertEqual(cp.push(path), ret)
|
||||
|
||||
def test_push_dir_non_absolute_path(self):
|
||||
'''
|
||||
Test if push_dir fails on a non absolute path.
|
||||
|
@ -509,36 +130,6 @@ class CpTestCase(TestCase):
|
|||
|
||||
self.assertEqual(cp.push_dir(path), ret)
|
||||
|
||||
@patch('os.path.isfile', MagicMock(return_value=True))
|
||||
def test_push_dir_file_success(self):
|
||||
'''
|
||||
Test if push_dir succeeds on a file.
|
||||
'''
|
||||
path = '/srv/salt/saltines'
|
||||
ret = True
|
||||
|
||||
with patch('salt.modules.cp.push', MagicMock(return_value=True)):
|
||||
self.assertEqual(cp.push_dir(path), ret)
|
||||
|
||||
@patch('os.path.isfile', MagicMock(return_value=False))
|
||||
def test_push_dir_success(self):
|
||||
'''
|
||||
Test if push_dir succeeds on a file.
|
||||
'''
|
||||
path = '/srv/salt/cheese'
|
||||
# The tuple must be enclosed within another tuple since Mock/MagicMock
|
||||
# will unpack its return_value if return_value is set to an iterable.
|
||||
# This at least happens when Mock is mocking a function that is being
|
||||
# returned into a generator context.
|
||||
mock_walk_ret = (('/srv/salt/cheese',
|
||||
[],
|
||||
['saltines.sls', 'biscuits.sls']),)
|
||||
ret = True
|
||||
|
||||
with patch('salt.modules.cp.push', MagicMock(return_value=True)):
|
||||
with patch('os.walk', MagicMock(return_value=mock_walk_ret)):
|
||||
self.assertEqual(cp.push_dir(path), ret)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
from integration import run_tests
|
||||
|
|
5
tests/unit/modules/zypp/zypper-repo-1.cfg
Normal file
5
tests/unit/modules/zypp/zypper-repo-1.cfg
Normal file
|
@ -0,0 +1,5 @@
|
|||
[SLE12-SP1-x86_64-Update]
|
||||
enabled=1
|
||||
autorefresh=1
|
||||
baseurl=http://somehost.com/SUSE/Updates/SLE-SERVER/12-SP1/x86_64/update/
|
||||
type=NONE
|
5
tests/unit/modules/zypp/zypper-repo-2.cfg
Normal file
5
tests/unit/modules/zypp/zypper-repo-2.cfg
Normal file
|
@ -0,0 +1,5 @@
|
|||
[SLE12-SP1-x86_64-Update-disabled]
|
||||
enabled=0
|
||||
autorefresh=0
|
||||
baseurl=http://somehost.com/SUSE/Updates/SLE-SERVER/12-SP1/x86_64/update/
|
||||
type=NONE
|
|
@ -17,6 +17,8 @@ from salttesting.mock import (
|
|||
from salt.exceptions import CommandExecutionError
|
||||
|
||||
import os
|
||||
from salt.ext.six.moves import configparser
|
||||
import StringIO
|
||||
|
||||
from salttesting.helpers import ensure_in_syspath
|
||||
|
||||
|
@ -391,6 +393,25 @@ class ZypperTestCase(TestCase):
|
|||
self.assertTrue(diff[pkg_name]['old'])
|
||||
self.assertFalse(diff[pkg_name]['new'])
|
||||
|
||||
def test_repo_value_info(self):
|
||||
'''
|
||||
Tests if repo info is properly parsed.
|
||||
|
||||
:return:
|
||||
'''
|
||||
repos_cfg = configparser.ConfigParser()
|
||||
for cfg in ['zypper-repo-1.cfg', 'zypper-repo-2.cfg']:
|
||||
repos_cfg.readfp(StringIO.StringIO(get_test_data(cfg)))
|
||||
|
||||
for alias in repos_cfg.sections():
|
||||
r_info = zypper._get_repo_info(alias, repos_cfg=repos_cfg)
|
||||
self.assertEqual(type(r_info['type']), type(None))
|
||||
self.assertEqual(type(r_info['enabled']), bool)
|
||||
self.assertEqual(type(r_info['autorefresh']), bool)
|
||||
self.assertEqual(type(r_info['baseurl']), str)
|
||||
self.assertEqual(r_info['type'], None)
|
||||
self.assertEqual(r_info['enabled'], alias == 'SLE12-SP1-x86_64-Update')
|
||||
self.assertEqual(r_info['autorefresh'], alias == 'SLE12-SP1-x86_64-Update')
|
||||
|
||||
if __name__ == '__main__':
|
||||
from integration import run_tests
|
||||
|
|
Loading…
Add table
Reference in a new issue