Hello community,

here is the log from the commit of package salt for openSUSE:Factory checked in 
at 2017-03-12 20:00:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/salt (Old)
 and      /work/SRC/openSUSE:Factory/.salt.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "salt"

Sun Mar 12 20:00:14 2017 rev:63 rq:476766 version:2016.11.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/salt/salt.changes        2016-11-10 
13:19:08.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.salt.new/salt.changes   2017-03-12 
20:00:16.421393326 +0100
@@ -1,0 +2,91 @@
+Fri Mar  3 09:36:17 UTC 2017 - [email protected]
+
+- Update to 2016.11.3
+  See https://docs.saltstack.com/en/develop/topics/releases/2016.11.3.html
+  for full changelog
+
+- Use correct package names for PyYAML and MarkupSafe ([email protected])
+
+- Changed:
+ * add-ssh-option-to-salt-ssh.patch
+
+- Added:
+ * add-options-for-dockerng.patch
+ * fix-case-in-os_family-for-suse.patch
+ * fix-regression-in-file.get_managed-add-unit-tests.patch
+ * translate-variable-arguments-if-they-contain-hidden-.patch
+
+- Removed:
+ * add-buildargs-option-to-dockerng.build.patch
+ * docker-buildargs-require-minimal-dockerpy-1.6.0-and-.patch
+ * fix-a-typo-for-master-comments.patch
+ * fix-error-parsing.patch
+ * fix-leading-dots-on-sanitized-hostname.patch
+ * fix-timezone-handling-for-rpm-installtime-bsc-101707.patch
+ * increasing-timeouts-for-running-integrations-tests.patch
+ * prevent-crash-on-unknown-to-the-repo-package.patch
+ * prevents-oserror-exception-in-case-path-doesn-t-exis.patch
+ * snapper-module-improvements.patch
+ * support-dryrun-for-dockerng.sls_build.patch
+
+-------------------------------------------------------------------
+Thu Feb 16 14:41:48 UTC 2017 - [email protected]
+
+- Update to 2016.11.2
+  See https://docs.saltstack.com/en/develop/topics/releases/2016.11.2.html
+  for full changelog
+
+- Bugfixes:
+  * keep fix for migrating salt home directory (bsc#1022562)
+  * Fix salt-minion update on RHEL (bsc#1022841)
+  * Prevents 'OSError' exception in case certain job cache path 
+    doesn't exist (bsc#1023535)
+
+- Added:
+  * add-a-salt-minion-service-control-file.patch
+  * add-buildargs-option-to-dockerng.build.patch
+  * add-ssh-option-to-salt-ssh.patch
+  * add-yum-plugin.patch
+  * avoid-failures-on-sles-12-sp2-because-of-new-systemd.patch
+  * change-travis-configuration-file-to-use-salt-toaster.patch
+  * docker-buildargs-require-minimal-dockerpy-1.6.0-and-.patch
+  * fix-a-typo-for-master-comments.patch
+  * fix-error-parsing.patch
+  * fix-leading-dots-on-sanitized-hostname.patch
+  * fix-timezone-handling-for-rpm-installtime-bsc-101707.patch
+  * increasing-timeouts-for-running-integrations-tests.patch
+  * prevent-crash-on-unknown-to-the-repo-package.patch
+  * prevents-oserror-exception-in-case-path-doesn-t-exis.patch
+  * snapper-module-improvements.patch
+  * support-dryrun-for-dockerng.sls_build.patch
+
+- Renamed:
+  * 0001-tserong-suse.com-We-don-t-have-python-systemd-so-not.patch ->
+     tserong-suse.com-we-don-t-have-python-systemd-so-not.patch
+  * 0002-Run-salt-master-as-dedicated-salt-user.patch ->
+     run-salt-master-as-dedicated-salt-user.patch
+  * 0003-Check-if-byte-strings-are-properly-encoded-in-UTF-8.patch ->
+     check-if-byte-strings-are-properly-encoded-in-utf-8.patch
+  * 0004-do-not-generate-a-date-in-a-comment-to-prevent-rebui.patch ->
+     do-not-generate-a-date-in-a-comment-to-prevent-rebui.patch
+  * 0007-Add-zypp-notify-plugin.patch ->
+     add-zypp-notify-plugin.patch
+  * 0009-fix-salt-summary-to-count-not-responding-minions-cor.patch ->
+     fix-salt-summary-to-count-not-responding-minions-cor.patch
+  * 0010-Run-salt-api-as-user-salt-bsc-990029.patch ->
+     run-salt-api-as-user-salt-bsc-990029.patch
+  * 0013-Setting-up-OS-grains-for-SLES-Expanded-Support-SUSE-.patch ->
+     setting-up-os-grains-for-sles-expanded-support-suse-.patch
+
+- Removed:
+  * 0005-Use-SHA256-hash-type-by-default.patch
+  * 0006-Create-salt-proxy-instantiated-service-file.patch
+  * 0008-snapper-execution-module.patch
+  * 0011-Fix-snapper_test-for-python26.patch
+  * 0012-Fix-pkg.upgrade-for-zypper.patch
+  * 0014-acl.delfacl-fix-position-of-X-option-to-setfacl.patch
+  * 0015-Change-travis-configuration-file-to-use-salt-toaster.patch
+  * 0016-Fix-pkg.latest_version-when-latest-already-installed.patch
+  * 0017-Including-resolver-params-for-Zypper-debug-solver.patch
+
+-------------------------------------------------------------------

Old:
----
  0001-tserong-suse.com-We-don-t-have-python-systemd-so-not.patch
  0002-Run-salt-master-as-dedicated-salt-user.patch
  0003-Check-if-byte-strings-are-properly-encoded-in-UTF-8.patch
  0004-do-not-generate-a-date-in-a-comment-to-prevent-rebui.patch
  0005-Use-SHA256-hash-type-by-default.patch
  0006-Create-salt-proxy-instantiated-service-file.patch
  0007-Add-zypp-notify-plugin.patch
  0008-snapper-execution-module.patch
  0009-fix-salt-summary-to-count-not-responding-minions-cor.patch
  0010-Run-salt-api-as-user-salt-bsc-990029.patch
  0011-Fix-snapper_test-for-python26.patch
  0012-Fix-pkg.upgrade-for-zypper.patch
  0013-Setting-up-OS-grains-for-SLES-Expanded-Support-SUSE-.patch
  0014-acl.delfacl-fix-position-of-X-option-to-setfacl.patch
  0015-Change-travis-configuration-file-to-use-salt-toaster.patch
  0016-Fix-pkg.latest_version-when-latest-already-installed.patch
  0017-Including-resolver-params-for-Zypper-debug-solver.patch
  salt-2016.3.4.tar.gz

New:
----
  add-a-salt-minion-service-control-file.patch
  add-options-for-dockerng.patch
  add-ssh-option-to-salt-ssh.patch
  add-yum-plugin.patch
  add-zypp-notify-plugin.patch
  avoid-failures-on-sles-12-sp2-because-of-new-systemd.patch
  change-travis-configuration-file-to-use-salt-toaster.patch
  check-if-byte-strings-are-properly-encoded-in-utf-8.patch
  do-not-generate-a-date-in-a-comment-to-prevent-rebui.patch
  fix-case-in-os_family-for-suse.patch
  fix-regression-in-file.get_managed-add-unit-tests.patch
  fix-salt-summary-to-count-not-responding-minions-cor.patch
  run-salt-api-as-user-salt-bsc-990029.patch
  run-salt-master-as-dedicated-salt-user.patch
  salt-2016.11.3.tar.gz
  setting-up-os-grains-for-sles-expanded-support-suse-.patch
  translate-variable-arguments-if-they-contain-hidden-.patch
  tserong-suse.com-we-don-t-have-python-systemd-so-not.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ salt.spec ++++++
--- /var/tmp/diff_new_pack.ofsSts/_old  2017-03-12 20:00:17.913182241 +0100
+++ /var/tmp/diff_new_pack.ofsSts/_new  2017-03-12 20:00:17.917181675 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package salt
 #
-# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -37,11 +37,11 @@
 %bcond_with    builddocs
 
 Name:           salt
-Version:        2016.3.4
+Version:        2016.11.3
 Release:        0
 Summary:        A parallel remote execution system
 License:        Apache-2.0
-Group:          System/Monitoring
+Group:          System/Management
 Url:            http://saltstack.org/
 # Git: https://github.com/openSUSE/salt.git
 Source0:        
https://pypi.io/packages/source/s/%{name}/%{name}-%{version}.tar.gz
@@ -53,61 +53,62 @@
 
 # PATCH-FIX-OPENSUSE use-forking-daemon.patch [email protected] -- We don't 
have python-systemd, so notify can't work
 # We do not upstream this patch because this is something that we have to fix 
on our side
-Patch1:         0001-tserong-suse.com-We-don-t-have-python-systemd-so-not.patch
+Patch1:         tserong-suse.com-we-don-t-have-python-systemd-so-not.patch
 # PATCH-FIX-OPENSUSE use-salt-user-for-master.patch -- Run salt master as 
dedicated salt user
 # We do not upstream this patch because this is suse custom configuration
-Patch2:         0002-Run-salt-master-as-dedicated-salt-user.patch
+Patch2:         run-salt-master-as-dedicated-salt-user.patch
 # PATCH-FIX-OPENSUSE https://github.com/saltstack/salt/pull/30424
 # We do not upstream this patch because it has been fixed upstream
 # (see: 
https://trello.com/c/wh96lCD4/1528-get-rid-of-0003-check-if-byte-strings-are-properly-encoded-in-utf-8-patch-in-the-salt-package)
-Patch3:         0003-Check-if-byte-strings-are-properly-encoded-in-UTF-8.patch
+Patch3:         check-if-byte-strings-are-properly-encoded-in-utf-8.patch
 # PATCH-FIX-OPENSUSE prevent rebuilds in OBS
 # We do not upstream this patch because the issue is on our side
-Patch4:         0004-do-not-generate-a-date-in-a-comment-to-prevent-rebui.patch
-# PATCH-FIX-OPENSUSE - Upstream default hash type is set to MD5, while we 
require SHA256 (bsc#955373)
-# PR https://github.com/saltstack/salt/pull/35341 (15.08.2016 - not merged yet)
-Patch5:         0005-Use-SHA256-hash-type-by-default.patch
-# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/31798
-# PR already merged. This will be gone in the next version
-Patch6:         0006-Create-salt-proxy-instantiated-service-file.patch
+Patch4:         do-not-generate-a-date-in-a-comment-to-prevent-rebui.patch
 # PATCH-FIX-OPENSUSE Generate events from the Salt minion,
-#                    if Zypper has been used outside the Salt infrastructure
-# We do not upstream this because this is for SUSE only (15.08.2016)
-Patch7:         0007-Add-zypp-notify-plugin.patch
-# PATCH-FIX_UPSTREAM
-Patch8:         0008-snapper-execution-module.patch
-# PATCH-FIX_UPSTREAM
-Patch9:         0009-fix-salt-summary-to-count-not-responding-minions-cor.patch
+# We do not upstream this because this is for SUSE only (15.08.2016) if Zypper 
has been used outside the Salt infrastructure
+Patch5:         add-zypp-notify-plugin.patch
+# PATCH-FIX_OPENSUSE
+Patch6:         run-salt-api-as-user-salt-bsc-990029.patch
+# PATCH-FIX_OPENSUSE
+Patch7:         change-travis-configuration-file-to-use-salt-toaster.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/37856 (pending to 
include in 2016.11)
+Patch8:         setting-up-os-grains-for-sles-expanded-support-suse-.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/34165
+Patch9:         fix-salt-summary-to-count-not-responding-minions-cor.patch
+# PATCH-FIX_OPENSUSE
+Patch10:        avoid-failures-on-sles-12-sp2-because-of-new-systemd.patch
+# PATCH-FIX_OPENSUSE
+Patch11:        add-yum-plugin.patch
 # PATCH-FIX_OPENSUSE
-Patch10:        0010-Run-salt-api-as-user-salt-bsc-990029.patch
-# PATCH-FIX_UPSTREAM
-Patch11:        0011-Fix-snapper_test-for-python26.patch
-# PATCH-FIX_UPSTREAM
-Patch12:        0012-Fix-pkg.upgrade-for-zypper.patch
-# PATCH-FIX_UPSTREAM
-Patch13:        0013-Setting-up-OS-grains-for-SLES-Expanded-Support-SUSE-.patch
-# PATCH-FIX_UPSTREAM
-Patch14:        0014-acl.delfacl-fix-position-of-X-option-to-setfacl.patch
+Patch12:        add-ssh-option-to-salt-ssh.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/38806
+Patch13:        add-a-salt-minion-service-control-file.patch
+# PATCH-FIX-OPENSUSE
+Patch14:        add-options-for-dockerng.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/39591
+Patch15:        fix-case-in-os_family-for-suse.patch
 # PATCH-FIX_OPENSUSE
-Patch15:        0015-Change-travis-configuration-file-to-use-salt-toaster.patch
-# PATCH-FIX_UPSTREAM
-Patch16:        0016-Fix-pkg.latest_version-when-latest-already-installed.patch
-# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/37430
-Patch17:        0017-Including-resolver-params-for-Zypper-debug-solver.patch
+Patch16:        translate-variable-arguments-if-they-contain-hidden-.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/39762
+Patch17:        fix-regression-in-file.get_managed-add-unit-tests.patch
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  logrotate
 BuildRequires:  python
 BuildRequires:  python-devel
 # requirements/base.txt
+%if 0%{?rhel}
+BuildRequires:  python-jinja2
+%else
 BuildRequires:  python-Jinja2
+%endif
+BuildRequires:  python-MarkupSafe
+BuildRequires:  python-PyYAML
 BuildRequires:  python-futures >= 2.0
-BuildRequires:  python-markupsafe
 BuildRequires:  python-msgpack-python > 0.3
 BuildRequires:  python-psutil
 BuildRequires:  python-requests >= 1.0.0
 BuildRequires:  python-tornado >= 4.2.1
-BuildRequires:  python-yaml
 # requirements/opt.txt (not all)
 # BuildRequires:  python-MySQL-python
 # BuildRequires:  python-timelib
@@ -160,14 +161,19 @@
 Requires:       python-certifi
 %endif
 # requirements/base.txt
+%if 0%{?rhel}
+Requires:       python-jinja2
+Requires:       yum
+%else
 Requires:       python-Jinja2
+%endif
+Requires:       python-MarkupSafe
+Requires:       python-PyYAML
 Requires:       python-futures >= 2.0
-Requires:       python-markupsafe
 Requires:       python-msgpack-python > 0.3
 Requires:       python-psutil
 Requires:       python-requests >= 1.0.0
 Requires:       python-tornado >= 4.2.1
-Requires:       python-yaml
 %if 0%{?suse_version}
 # required for zypper.py
 Requires:       rpm-python
@@ -217,6 +223,10 @@
 BuildRequires:  zsh
 %endif
 
+%if 0%{?rhel}
+BuildRequires:  yum
+%endif
+
 %description
 Salt is a distributed remote execution system used to execute commands and
 query data. It was developed in order to bring the best solutions found in
@@ -227,7 +237,7 @@
 
 %package api
 Summary:        The api for Salt a parallel remote execution system
-Group:          System/Monitoring
+Group:          System/Management
 Requires:       %{name} = %{version}-%{release}
 Requires:       %{name}-master = %{version}-%{release}
 Requires:       python-CherryPy >= 3.2.2
@@ -237,7 +247,7 @@
 
 %package cloud
 Summary:        Generic cloud provisioning tool for Saltstack
-Group:          System/Monitoring
+Group:          System/Management
 Requires:       %{name} = %{version}-%{release}
 Requires:       %{name}-master = %{version}-%{release}
 Requires:       python-apache-libcloud
@@ -263,7 +273,7 @@
 
 %package master
 Summary:        The management component of Saltstack both protocols zmq and 
raet supported
-Group:          System/Monitoring
+Group:          System/Management
 Requires:       %{name} = %{version}-%{release}
 %if 0%{?suse_version}
 Recommends:     python-pygit2 >= 0.20.3
@@ -295,8 +305,9 @@
 
 %package minion
 Summary:        The client component for Saltstack
-Group:          System/Monitoring
-Requires:       %{name} = %{version}-%{release}
+Group:          System/Management
+Requires(pre):  %{name} = %{version}-%{release}
+
 %if %{with systemd}
 %{?systemd_requires}
 %else
@@ -314,7 +325,7 @@
 
 %package raet
 Summary:        Raet Support for Saltstack
-Group:          System/Monitoring
+Group:          System/Management
 Requires:       %{name} = %{version}-%{release}
 Requires:       python-enum34
 Requires:       python-ioflo >= 1.1.7
@@ -336,7 +347,7 @@
 
 %package proxy
 Summary:        Component for salt that enables controlling arbitrary devices
-Group:          System/Monitoring
+Group:          System/Management
 Requires:       %{name} = %{version}-%{release}
 %if %{with systemd}
 %{?systemd_requires}
@@ -359,7 +370,7 @@
 
 %package syndic
 Summary:        The syndic component for saltstack
-Group:          System/Monitoring
+Group:          System/Management
 Requires:       %{name} = %{version}-%{release}
 Requires:       %{name}-master = %{version}-%{release}
 %if %{with systemd}
@@ -380,7 +391,7 @@
 
 %package ssh
 Summary:        Management component for Saltstack with ssh protocol
-Group:          System/Monitoring
+Group:          System/Management
 Requires:       %{name} = %{version}-%{release}
 Requires:       %{name}-master = %{version}-%{release}
 %if 0%{?suse_version}
@@ -453,13 +464,14 @@
 %patch2 -p1
 %patch3 -p1
 %patch4 -p1
-%patch5 -p1
-%patch6 -p1
 
 # This is SUSE-only patch
 %if 0%{?suse_version}
-%patch7 -p1
+%patch5 -p1
 %endif
+
+%patch6 -p1
+%patch7 -p1
 %patch8 -p1
 %patch9 -p1
 %patch10 -p1
@@ -507,6 +519,7 @@
 install -Dd -m 0750 %{buildroot}%{_localstatedir}/cache/salt/master/roots
 install -Dd -m 0750 %{buildroot}%{_localstatedir}/cache/salt/master/syndics
 install -Dd -m 0750 %{buildroot}%{_localstatedir}/cache/salt/master/tokens
+install -Dd -m 0750 %{buildroot}/var/lib/salt
 install -Dd -m 0750 %{buildroot}/srv/salt
 install -Dd -m 0750 %{buildroot}/srv/pillar
 install -Dd -m 0750 %{buildroot}/srv/spm
@@ -532,10 +545,18 @@
 %{__install} scripts/zypper/plugins/commit/zyppnotify 
%{buildroot}%{_prefix}/lib/zypp/plugins/commit/zyppnotify
 %endif
 
+# Install Yum plugins only on RH machines
+%if 0%{?fedora} || 0%{?rhel}
+install -Dd %{buildroot}%{_prefix}/share/yum-plugins
+install -Dd %{buildroot}/etc/yum/pluginconf.d
+%{__install} scripts/yum/plugins/yumnotify.py 
%{buildroot}%{_prefix}/share/yum-plugins
+%{__install} scripts/yum/plugins/yumnotify.conf 
%{buildroot}/etc/yum/pluginconf.d
+%endif
+
 ## install init and systemd scripts
 %if %{with systemd}
 install -Dpm 0644 pkg/salt-master.service 
%{buildroot}%{_unitdir}/salt-master.service
-install -Dpm 0644 pkg/salt-minion.service 
%{buildroot}%{_unitdir}/salt-minion.service
+install -Dpm 0644 pkg/suse/salt-minion.service 
%{buildroot}%{_unitdir}/salt-minion.service
 install -Dpm 0644 pkg/salt-syndic.service 
%{buildroot}%{_unitdir}/salt-syndic.service
 install -Dpm 0644 pkg/salt-api.service    
%{buildroot}%{_unitdir}/salt-api.service
 install -Dpm 0644 pkg/[email protected]  
%{buildroot}%{_unitdir}/[email protected]
@@ -601,8 +622,9 @@
 %endif
 
 %pre
+getent passwd salt | grep srv\/salt >/dev/null && usermod -d /var/lib/salt salt
 getent group salt >/dev/null || %{_sbindir}/groupadd -r salt
-getent passwd salt >/dev/null || %{_sbindir}/useradd -r -g salt -d /srv/salt 
-s /bin/false -c "salt-master daemon" salt
+getent passwd salt >/dev/null || %{_sbindir}/useradd -r -g salt -d 
/var/lib/salt -s /bin/false -c "salt-master daemon" salt
 
 %post
 %if %{with systemd}
@@ -617,11 +639,6 @@
 %else
 %if 0%{?suse_version}
 %stop_on_removal salt-proxy
-%else
-  if [ $1 -eq 0 ] ; then
-      /sbin/service salt-proxy stop >/dev/null 2>&1
-      /sbin/chkconfig --del salt-proxy
-  fi
 %endif
 %endif
 
@@ -879,6 +896,12 @@
 %{_prefix}/lib/zypp/plugins/commit/zyppnotify
 %endif
 
+# Install Yum plugins only on RH machines
+%if 0%{?fedora} || 0%{?rhel}
+%{_prefix}/share/yum-plugins/
+/etc/yum/pluginconf.d/yumnotify.conf
+%endif
+
 %if %{with systemd}
 %{_unitdir}/salt-minion.service
 %else
@@ -922,6 +945,7 @@
 %dir               %attr(0750, salt, salt) 
%{_sysconfdir}/salt/pki/master/minions_denied/
 %dir               %attr(0750, salt, salt) 
%{_sysconfdir}/salt/pki/master/minions_pre/
 %dir               %attr(0750, salt, salt) 
%{_sysconfdir}/salt/pki/master/minions_rejected/
+%dir               %attr(0755, salt, salt) /var/lib/salt
 %dir               %attr(0755, root, salt) /srv/salt
 %dir               %attr(0755, root, salt) /srv/pillar
 %dir               %attr(0750, salt, salt) %{_localstatedir}/cache/salt/master/
@@ -961,6 +985,7 @@
 %if %{with systemd}
 /usr/lib/tmpfiles.d/salt.conf
 %endif
+%{_mandir}/man1/salt.1.*
 
 %if %{with docs}
 %files doc

++++++ add-a-salt-minion-service-control-file.patch ++++++
>From 69eeaf17252a2912ed33f2160c14282c2ff703bc Mon Sep 17 00:00:00 2001
From: Bo Maryniuk <[email protected]>
Date: Wed, 18 Jan 2017 15:38:53 +0100
Subject: [PATCH] Add a salt-minion service control file

---
 pkg/suse/salt-minion.service | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
 create mode 100644 pkg/suse/salt-minion.service

diff --git a/pkg/suse/salt-minion.service b/pkg/suse/salt-minion.service
new file mode 100644
index 0000000000..1dbaa77755
--- /dev/null
+++ b/pkg/suse/salt-minion.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=The Salt Minion
+After=network.target
+
+[Service]
+Type=notify
+NotifyAccess=all
+LimitNOFILE=8192
+ExecStart=/usr/bin/salt-minion
+KillMode=process
+Restart=on-failure
+RestartSec=15
+
+[Install]
+WantedBy=multi-user.target
-- 
2.11.0


++++++ add-options-for-dockerng.patch ++++++
>From 95d547d3e6c98f927eaad77346b84b2ccef95627 Mon Sep 17 00:00:00 2001
From: Michael Calmer <[email protected]>
Date: Thu, 19 Jan 2017 15:39:10 +0100
Subject: [PATCH] add options for dockerng

* add buildargs option to dockerng.build
* docker buildargs require minimal dockerpy 1.6.0 and docker version 1.9.0
* update version in the docs
* support dryrun for dockerng.sls_build

provide the possibility to put extra modules into the thin

added unit test for dockerng.sls_build dryrun option
---
 salt/modules/dockerng.py            | 51 ++++++++++++++++++-----
 tests/unit/modules/dockerng_test.py | 82 +++++++++++++++++++++++++++++++++++++
 2 files changed, 122 insertions(+), 11 deletions(-)

diff --git a/salt/modules/dockerng.py b/salt/modules/dockerng.py
index 29af703ffa..c199fede1e 100644
--- a/salt/modules/dockerng.py
+++ b/salt/modules/dockerng.py
@@ -28,13 +28,13 @@ to replace references to ``dockerng`` with ``docker``.
 Installation Prerequisites
 --------------------------
 
-This execution module requires at least version 1.4.0 of both docker-py_ and
-Docker_. docker-py can easily be installed using :py:func:`pip.install
-<salt.modules.pip.install>`:
+This execution module requires at least version 1.6.0 of docker-py_ and
+version 1.9.0 of Docker_. docker-py can easily be installed using
+:py:func:`pip.install <salt.modules.pip.install>`:
 
 .. code-block:: bash
 
-    salt myminion pip.install docker-py>=1.4.0
+    salt myminion pip.install docker-py>=1.6.0
 
 .. _docker-py: https://pypi.python.org/pypi/docker-py
 .. _Docker: https://www.docker.com/
@@ -332,8 +332,8 @@ __func_alias__ = {
 }
 
 # Minimum supported versions
-MIN_DOCKER = (1, 6, 0)
-MIN_DOCKER_PY = (1, 4, 0)
+MIN_DOCKER = (1, 9, 0)
+MIN_DOCKER_PY = (1, 6, 0)
 
 VERSION_RE = r'([\d.]+)'
 
@@ -3557,7 +3557,8 @@ def build(path=None,
           rm=True,
           api_response=False,
           fileobj=None,
-          dockerfile=None):
+          dockerfile=None,
+          buildargs=None):
     '''
     Builds a docker image from a Dockerfile or a URL
 
@@ -3591,6 +3592,10 @@ def build(path=None,
 
         .. versionadded:: develop
 
+    buildargs
+        A dictionary of build arguments provided to the docker build process.
+
+
     **RETURN DATA**
 
     A dictionary containing one or more of the following keys:
@@ -3637,7 +3642,8 @@ def build(path=None,
                                fileobj=fileobj,
                                rm=rm,
                                nocache=not cache,
-                               dockerfile=dockerfile)
+                               dockerfile=dockerfile,
+                               buildargs=buildargs)
     ret = {'Time_Elapsed': time.time() - time_started}
     _clear_context()
 
@@ -5755,7 +5761,9 @@ def call(name, function, *args, **kwargs):
         raise CommandExecutionError('Missing function parameter')
 
     # move salt into the container
-    thin_path = salt.utils.thin.gen_thin(__opts__['cachedir'])
+    thin_path = salt.utils.thin.gen_thin(__opts__['cachedir'],
+                                         
extra_mods=__salt__['config.option']("thin_extra_mods", ''),
+                                         
so_mods=__salt__['config.option']("thin_so_mods", ''))
     with io.open(thin_path, 'rb') as file:
         _client_wrapper('put_archive', name, thin_dest_path, file)
     try:
@@ -5865,7 +5873,7 @@ def sls(name, mods=None, saltenv='base', **kwargs):
 
 
 def sls_build(name, base='opensuse/python', mods=None, saltenv='base',
-              **kwargs):
+              dryrun=False, **kwargs):
     '''
     Build a docker image using the specified sls modules and base image.
 
@@ -5873,6 +5881,24 @@ def sls_build(name, base='opensuse/python', mods=None, 
saltenv='base',
     can build a docker image inside myminion that results of applying those
     states by doing:
 
+    base
+        the base image
+
+    mods
+        the state modules to execute during build
+
+    saltenv
+        the salt environment to use
+
+    dryrun: False
+        when set to True the container will not be commited at the end of
+        the build. The dryrun succeed also when the state contains errors.
+
+    **RETURN DATA**
+
+    A dictionary with the ID of the new container. In case of a dryrun,
+    the state result is returned and the container gets removed.
+
     CLI Example:
 
     .. code-block:: bash
@@ -5905,9 +5931,12 @@ def sls_build(name, base='opensuse/python', mods=None, 
saltenv='base',
         # Now execute the state into the container
         ret = __salt__['dockerng.sls'](id_, mods, saltenv, **kwargs)
         # fail if the state was not successful
-        if not salt.utils.check_state_result(ret):
+        if not dryrun and not salt.utils.check_state_result(ret):
             raise CommandExecutionError(ret)
     finally:
         __salt__['dockerng.stop'](id_)
 
+    if dryrun:
+        __salt__['dockerng.rm'](id_)
+        return ret
     return __salt__['dockerng.commit'](id_, name)
diff --git a/tests/unit/modules/dockerng_test.py 
b/tests/unit/modules/dockerng_test.py
index ec4901e275..546635577a 100644
--- a/tests/unit/modules/dockerng_test.py
+++ b/tests/unit/modules/dockerng_test.py
@@ -680,6 +680,84 @@ class DockerngTestCase(TestCase):
         self.assertEqual(
             {'Id': 'ID2', 'Image': 'foo', 'Time_Elapsed': 42}, ret)
 
+    def test_sls_build_dryrun(self, *args):
+        '''
+        test build sls image in dryrun mode.
+        '''
+        docker_start_mock = MagicMock(
+            return_value={})
+        docker_create_mock = MagicMock(
+            return_value={'Id': 'ID', 'Name': 'NAME'})
+        docker_stop_mock = MagicMock(
+            return_value={'state': {'old': 'running', 'new': 'stopped'},
+                          'result': True})
+        docker_rm_mock = MagicMock(
+            return_value={})
+
+        docker_sls_mock = MagicMock(
+            return_value={
+                "file_|-/etc/test.sh_|-/etc/test.sh_|-managed": {
+                    "comment": "File /etc/test.sh is in the correct state",
+                    "name": "/etc/test.sh",
+                    "start_time": "07:04:26.834792",
+                    "result": True,
+                    "duration": 13.492,
+                    "__run_num__": 0,
+                    "changes": {}
+                },
+                "test_|-always-passes_|-foo_|-succeed_without_changes": {
+                    "comment": "Success!",
+                    "name": "foo",
+                    "start_time": "07:04:26.848915",
+                    "result": True,
+                    "duration": 0.363,
+                    "__run_num__": 1,
+                    "changes": {}
+                }
+            })
+
+        ret = None
+        with patch.dict(dockerng_mod.__salt__, {
+                'dockerng.start': docker_start_mock,
+                'dockerng.create': docker_create_mock,
+                'dockerng.stop': docker_stop_mock,
+                'dockerng.rm': docker_rm_mock,
+                'dockerng.sls': docker_sls_mock}):
+            ret = dockerng_mod.sls_build(
+                'foo',
+                mods='foo',
+                dryrun=True
+            )
+        docker_create_mock.assert_called_once_with(
+            cmd='sleep infinity',
+            image='opensuse/python', interactive=True, name='foo', tty=True)
+        docker_start_mock.assert_called_once_with('ID')
+        docker_sls_mock.assert_called_once_with('ID', 'foo', 'base')
+        docker_stop_mock.assert_called_once_with('ID')
+        docker_rm_mock.assert_called_once_with('ID')
+        self.assertEqual(
+                {
+                "file_|-/etc/test.sh_|-/etc/test.sh_|-managed": {
+                    "comment": "File /etc/test.sh is in the correct state",
+                    "name": "/etc/test.sh",
+                    "start_time": "07:04:26.834792",
+                    "result": True,
+                    "duration": 13.492,
+                    "__run_num__": 0,
+                    "changes": {}
+                },
+                "test_|-always-passes_|-foo_|-succeed_without_changes": {
+                    "comment": "Success!",
+                    "name": "foo",
+                    "start_time": "07:04:26.848915",
+                    "result": True,
+                    "duration": 0.363,
+                    "__run_num__": 1,
+                    "changes": {}
+                }
+                },
+                ret)
+
     def test_call_success(self):
         '''
         test module calling inside containers
@@ -694,6 +772,9 @@ class DockerngTestCase(TestCase):
             return_value={
                 'retcode': 0
             })
+        docker_config_mock = MagicMock(
+            return_value=''
+            )
         client = Mock()
         client.put_archive = Mock()
 
@@ -704,6 +785,7 @@ class DockerngTestCase(TestCase):
                     dockerng_mod.__salt__, {
                         'dockerng.run_all': docker_run_all_mock,
                         'dockerng.copy_to': docker_copy_to_mock,
+                        'config.option': docker_config_mock
                     }),
                 patch.dict(
                     dockerng_mod.__context__, {
-- 
2.11.0


++++++ add-ssh-option-to-salt-ssh.patch ++++++
>From c4c6610bf7314cc4c6ecf656bef341e2d1ca1587 Mon Sep 17 00:00:00 2001
From: Matei Albu <[email protected]>
Date: Mon, 19 Dec 2016 16:54:52 +0100
Subject: [PATCH] Add --ssh-option to salt-ssh

--ssh-option can be used to pass -o options to the ssh client.
(cherry picked from commit 16f21e5)

Add spaces around =

Fix salt-ssh err when -ssh-option is missing
---
 salt/client/ssh/__init__.py |  7 ++++++-
 salt/client/ssh/shell.py    | 19 ++++++++++++++++---
 salt/utils/parsers.py       | 18 +++++++++++++-----
 3 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/salt/client/ssh/__init__.py b/salt/client/ssh/__init__.py
index 23ec948fe0..bbef9d8de1 100644
--- a/salt/client/ssh/__init__.py
+++ b/salt/client/ssh/__init__.py
@@ -295,6 +295,9 @@ class SSH(object):
             'remote_port_forwards': self.opts.get(
                 'ssh_remote_port_forwards'
             ),
+            'ssh_options': self.opts.get(
+                'ssh_options'
+            )
         }
         if self.opts.get('rand_thin_dir'):
             self.defaults['thin_dir'] = os.path.join(
@@ -693,6 +696,7 @@ class Single(object):
             identities_only=False,
             sudo_user=None,
             remote_port_forwards=None,
+            ssh_options=None,
             **kwargs):
         # Get mine setting and mine_functions if defined in kwargs (from 
roster)
         self.mine = mine
@@ -749,7 +753,8 @@ class Single(object):
                 'mods': self.mods,
                 'identities_only': identities_only,
                 'sudo_user': sudo_user,
-                'remote_port_forwards': remote_port_forwards}
+                'remote_port_forwards': remote_port_forwards,
+                'ssh_options': ssh_options}
         # Pre apply changeable defaults
         self.minion_opts = {
                     'grains_cache': True,
diff --git a/salt/client/ssh/shell.py b/salt/client/ssh/shell.py
index f78cb623e1..613660fe34 100644
--- a/salt/client/ssh/shell.py
+++ b/salt/client/ssh/shell.py
@@ -64,7 +64,8 @@ class Shell(object):
             mods=None,
             identities_only=False,
             sudo_user=None,
-            remote_port_forwards=None):
+            remote_port_forwards=None,
+            ssh_options=None):
         self.opts = opts
         # ssh <ipv6>, but scp [<ipv6]:/path
         self.host = host.strip('[]')
@@ -78,6 +79,7 @@ class Shell(object):
         self.mods = mods
         self.identities_only = identities_only
         self.remote_port_forwards = remote_port_forwards
+        self.ssh_options = ssh_options
 
     def get_error(self, errstr):
         '''
@@ -169,6 +171,12 @@ class Shell(object):
             ret.append('-o {0} '.format(option))
         return ''.join(ret)
 
+    def _ssh_opts(self):
+        if self.ssh_options:
+            return ' '.join(['-o {0}'.format(opt)
+                            for opt in self.ssh_options])
+        return ''
+
     def _copy_id_str_old(self):
         '''
         Return the string to execute ssh-copy-id
@@ -176,11 +184,12 @@ class Shell(object):
         if self.passwd:
             # Using single quotes prevents shell expansion and
             # passwords containing '$'
-            return "{0} {1} '{2} -p {3} {4}@{5}'".format(
+            return "{0} {1} '{2} -p {3} {4} {5}@{6}'".format(
                     'ssh-copy-id',
                     '-i {0}.pub'.format(self.priv),
                     self._passwd_opts(),
                     self.port,
+                    self._ssh_opts(),
                     self.user,
                     self.host)
         return None
@@ -193,11 +202,12 @@ class Shell(object):
         if self.passwd:
             # Using single quotes prevents shell expansion and
             # passwords containing '$'
-            return "{0} {1} {2} -p {3} {4}@{5}".format(
+            return "{0} {1} {2} -p {3} {4} {5}@{6}".format(
                     'ssh-copy-id',
                     '-i {0}.pub'.format(self.priv),
                     self._passwd_opts(),
                     self.port,
+                    self._ssh_opts(),
                     self.user,
                     self.host)
         return None
@@ -229,6 +239,9 @@ class Shell(object):
         if ssh != 'scp' and self.remote_port_forwards:
             command.append(' '.join(['-R {0}'.format(item)
                                      for item in 
self.remote_port_forwards.split(',')]))
+        if self.ssh_options:
+            command.append(self._ssh_opts())
+
         command.append(cmd)
 
         return ' '.join(command)
diff --git a/salt/utils/parsers.py b/salt/utils/parsers.py
index 6330ed6596..c38506f3c5 100644
--- a/salt/utils/parsers.py
+++ b/salt/utils/parsers.py
@@ -2828,11 +2828,11 @@ class 
SaltSSHOptionParser(six.with_metaclass(OptionParserMeta,
             help='Pass a JID to be used instead of generating one.'
         )
 
-        ports_group = optparse.OptionGroup(
-            self, 'Port Forwarding Options',
-            'Parameters for setting up SSH port forwarding.'
+        ssh_group = optparse.OptionGroup(
+            self, 'SSH Options',
+            'Parameters for the SSH client.'
         )
-        ports_group.add_option(
+        ssh_group.add_option(
             '--remote-port-forwards',
             dest='ssh_remote_port_forwards',
             help='Setup remote port forwarding using the same syntax as with '
@@ -2840,7 +2840,15 @@ class 
SaltSSHOptionParser(six.with_metaclass(OptionParserMeta,
                  'forwarding definitions will be translated into multiple '
                  '-R parameters.'
         )
-        self.add_option_group(ports_group)
+        ssh_group.add_option(
+            '--ssh-option',
+            dest='ssh_options',
+            action='append',
+            help='Equivalent to the -o ssh command option. Passes options to '
+                 'the SSH client in the format used in the client 
configuration file. '
+                 'Can be used multiple times.'
+        )
+        self.add_option_group(ssh_group)
 
         auth_group = optparse.OptionGroup(
             self, 'Authentication Options',
-- 
2.11.0


++++++ add-yum-plugin.patch ++++++
>From a0523ac82a1dcca7a7c77f9b3816f237f211b94e Mon Sep 17 00:00:00 2001
From: Bo Maryniuk <[email protected]>
Date: Thu, 29 Sep 2016 17:00:14 +0200
Subject: [PATCH] Add YUM plugin

* Add plugin for Yum-Salt integration
* Add configuration for the yumnotify plugin
* Fixes wrong 'enabled' opts for yumnotify plugin
---
 scripts/yum/plugins/README.md      | 20 ++++++++++++++
 scripts/yum/plugins/yumnotify.conf |  2 ++
 scripts/yum/plugins/yumnotify.py   | 55 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 77 insertions(+)
 create mode 100644 scripts/yum/plugins/README.md
 create mode 100644 scripts/yum/plugins/yumnotify.conf
 create mode 100644 scripts/yum/plugins/yumnotify.py

diff --git a/scripts/yum/plugins/README.md b/scripts/yum/plugins/README.md
new file mode 100644
index 0000000000..cb3abd2260
--- /dev/null
+++ b/scripts/yum/plugins/README.md
@@ -0,0 +1,20 @@
+## What it is
+
+Plugin which provides a notification mechanism to Salt, if Yum is
+used outside of it.
+
+## Installation
+
+Configuration files are going to:
+
+       `/etc/yum/pluginconf.d/[name].conf`
+
+Plugin itself goes to:
+
+       `/usr/share/yum-plugins/[name].conf`
+
+## Permissions
+
+User:  root
+Group: root
+Mode:  644
diff --git a/scripts/yum/plugins/yumnotify.conf 
b/scripts/yum/plugins/yumnotify.conf
new file mode 100644
index 0000000000..8e4d76c728
--- /dev/null
+++ b/scripts/yum/plugins/yumnotify.conf
@@ -0,0 +1,2 @@
+[main]
+enabled=1
diff --git a/scripts/yum/plugins/yumnotify.py b/scripts/yum/plugins/yumnotify.py
new file mode 100644
index 0000000000..268e1e9531
--- /dev/null
+++ b/scripts/yum/plugins/yumnotify.py
@@ -0,0 +1,55 @@
+# Copyright (c) 2016 SUSE Linux LLC
+# All Rights Reserved.
+#
+# Author: Bo Maryniuk <[email protected]>
+
+from yum.plugins import TYPE_CORE
+from yum import config
+import os
+import hashlib
+
+CK_PATH = "/var/cache/salt/minion/rpmdb.cookie"
+RPM_PATH = "/var/lib/rpm/Packages"
+
+requires_api_version = '2.5'
+plugin_type = TYPE_CORE
+
+
+def _get_mtime():
+    """
+    Get the modified time of the RPM Database.
+
+    Returns:
+        Unix ticks
+    """
+    return os.path.exists(RPM_PATH) and int(os.path.getmtime(RPM_PATH)) or 0
+
+
+def _get_checksum():
+    """
+    Get the checksum of the RPM Database.
+
+    Returns:
+        hexdigest
+    """
+    digest = hashlib.md5()
+    with open(RPM_PATH, "rb") as rpm_db_fh:
+        while True:
+            buff = rpm_db_fh.read(0x1000)
+            if not buff:
+                break
+            digest.update(buff)
+    return digest.hexdigest()
+
+
+def posttrans_hook(conduit):
+    """
+    Hook after the package installation transaction.
+
+    :param conduit:
+    :return:
+    """
+    # Integrate Yum with Salt
+    if 'SALT_RUNNING' not in os.environ:
+        with open(CK_PATH, 'w') as ck_fh:
+            ck_fh.write('{chksum} {mtime}\n'.format(chksum=_get_checksum(), 
mtime=_get_mtime()))
-- 
2.11.0


++++++ 0007-Add-zypp-notify-plugin.patch -> add-zypp-notify-plugin.patch ++++++
--- /work/SRC/openSUSE:Factory/salt/0007-Add-zypp-notify-plugin.patch   
2016-11-10 13:19:07.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.salt.new/add-zypp-notify-plugin.patch   
2017-03-12 20:00:15.945460670 +0100
@@ -1,7 +1,7 @@
-From 484b0fa0250b4adc0da34d033ebc5e019e3e1240 Mon Sep 17 00:00:00 2001
+From 2616f36c3a1131a73546449d33d917783f6f1f7b Mon Sep 17 00:00:00 2001
 From: Bo Maryniuk <[email protected]>
 Date: Mon, 9 May 2016 10:33:44 +0200
-Subject: [PATCH 07/17] Add zypp-notify plugin
+Subject: [PATCH] Add zypp-notify plugin
 
 * Add unit test to the libzypp drift detector plugin
 ---
@@ -17,7 +17,7 @@
 
 diff --git a/scripts/zypper/plugins/commit/README.md 
b/scripts/zypper/plugins/commit/README.md
 new file mode 100644
-index 0000000..01c8917
+index 0000000000..01c8917c8e
 --- /dev/null
 +++ b/scripts/zypper/plugins/commit/README.md
 @@ -0,0 +1,3 @@
@@ -26,7 +26,7 @@
 +Plugins here are required to interact with SUSE Manager in conjunction of 
SaltStack and Zypper.
 diff --git a/scripts/zypper/plugins/commit/zyppnotify 
b/scripts/zypper/plugins/commit/zyppnotify
 new file mode 100755
-index 0000000..268298b
+index 0000000000..268298b108
 --- /dev/null
 +++ b/scripts/zypper/plugins/commit/zyppnotify
 @@ -0,0 +1,59 @@
@@ -91,7 +91,7 @@
 +DriftDetector().main()
 diff --git a/tests/unit/zypp_plugins_test.py b/tests/unit/zypp_plugins_test.py
 new file mode 100644
-index 0000000..550403c
+index 0000000000..550403cc24
 --- /dev/null
 +++ b/tests/unit/zypp_plugins_test.py
 @@ -0,0 +1,51 @@
@@ -148,7 +148,7 @@
 +    run_tests(ZyppPluginsTestCase, needs_daemon=False)
 diff --git a/tests/zypp_plugin.py b/tests/zypp_plugin.py
 new file mode 100644
-index 0000000..218f703
+index 0000000000..218f703811
 --- /dev/null
 +++ b/tests/zypp_plugin.py
 @@ -0,0 +1,64 @@
@@ -217,5 +217,6 @@
 +        '''
 +        self.closed = True
 -- 
-2.10.1
+2.11.0
+
 

++++++ avoid-failures-on-sles-12-sp2-because-of-new-systemd.patch ++++++
>From b338b21fe340ee4efa0045894315fcf20be1dc49 Mon Sep 17 00:00:00 2001
From: Silvio Moioli <[email protected]>
Date: Wed, 14 Dec 2016 10:33:39 +0100
Subject: [PATCH] Avoid failures on SLES 12 SP2 because of new systemd
 TaskMax limit (bsc#985112)

---
 pkg/salt-master.service | 1 +
 1 file changed, 1 insertion(+)

diff --git a/pkg/salt-master.service b/pkg/salt-master.service
index 59be50301a..ecd3edd467 100644
--- a/pkg/salt-master.service
+++ b/pkg/salt-master.service
@@ -6,6 +6,7 @@ After=network.target
 LimitNOFILE=16384
 Type=simple
 ExecStart=/usr/bin/salt-master
+TasksMax=infinity
 
 [Install]
 WantedBy=multi-user.target
-- 
2.11.0


++++++ change-travis-configuration-file-to-use-salt-toaster.patch ++++++
>From 79f9f4c06813d70cd03ad32c6c8ef8fec1656e88 Mon Sep 17 00:00:00 2001
From: Mihai Dinca <[email protected]>
Date: Fri, 14 Oct 2016 09:04:47 +0200
Subject: [PATCH] Change travis configuration file to use salt-toaster

---
 .travis.yml | 47 +++++++++++++++++++----------------------------
 1 file changed, 19 insertions(+), 28 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 7b4c8ce0e5..3101efb372 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,35 +1,26 @@
 language: python
 
 python:
-  - '2.6'
-  - '2.7'
+ - 2.7
 
-before_install:
-  - sudo apt-get update
-  - sudo apt-get install --fix-broken --ignore-missing -y -o 
Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" swig 
rabbitmq-server ruby python-apt mysql-server libmysqlclient-dev
-  - (git describe && git fetch --tags) || (git remote add upstream 
git://github.com/saltstack/salt.git && git fetch --tags upstream)
-  - pip install mock
-  - pip install --allow-external 
http://dl.dropbox.com/u/174789/m2crypto-0.20.1.tar.gz
-  - pip install --upgrade pep8 'pylint<=1.2.0'
-  - pip install --upgrade coveralls
-  - "if [[ $TRAVIS_PYTHON_VERSION == '2.6' ]]; then pip install unittest2 
ordereddict; fi"
-  - pip install 
git+https://github.com/saltstack/salt-testing.git#egg=SaltTesting
-
-install:
-  - pip install -r requirements/zeromq.txt -r requirements/cloud.txt
-  - pip install --allow-all-external -r requirements/opt.txt
+services:
+ - docker
 
-before_script:
-  - "/home/travis/virtualenv/python${TRAVIS_PYTHON_VERSION}/bin/pylint 
--rcfile=.testing.pylintrc salt/ && echo 'Finished Pylint Check Cleanly' || 
echo 'Finished Pylint Check With Errors'"
-  - "/home/travis/virtualenv/python${TRAVIS_PYTHON_VERSION}/bin/pep8 
--ignore=E501,E12 salt/ && echo 'Finished PEP-8 Check Cleanly' || echo 
'Finished PEP-8 Check With Errors'"
+env:
+    global:
+        - VERSION=leap42sp1 FLAVOR=devel NOPULL=true SALT_REPO=..
+    matrix:
+        - TARGET=suse.tests PYTEST_CFG=./configs/$TARGET/$VERSION/$FLAVOR.cfg
+        - TARGET=saltstack.unit 
PYTEST_CFG=./configs/$TARGET/$VERSION/default.cfg
+        - TARGET=saltstack.integration 
PYTEST_CFG=./configs/$TARGET/$VERSION/default.cfg
 
-script: "sudo -E 
/home/travis/virtualenv/python${TRAVIS_PYTHON_VERSION}/bin/python setup.py test 
--runtests-opts='--run-destructive --sysinfo -v --coverage'"
-
-after_success:
-  - coveralls
+before_install:
+- git clone --depth 1 https://github.com/openSUSE/salt-toaster.git
+- cd salt-toaster
+- echo "*" > .gitignore
+- tar xfz sandbox.tar.gz
+- sandbox/bin/pip install -r requirements.txt --exists-action w --upgrade
+- VERSION=leap42sp1 FLAVOR=default NOPULL=true make build_image
+- make build_image
 
-notifications:
-  irc:
-    channels: "irc.freenode.org#salt-devel"
-    on_success: change
-    on_failure: change
+script: make $TARGET PYTEST_CFG=$PYTEST_CFG
-- 
2.11.0


++++++ check-if-byte-strings-are-properly-encoded-in-utf-8.patch ++++++
>From df521307c4bff21ab7891e0086fc4dc8b7c2207c Mon Sep 17 00:00:00 2001
From: Bo Maryniuk <[email protected]>
Date: Mon, 18 Jan 2016 16:28:48 +0100
Subject: [PATCH] Check if byte strings are properly encoded in UTF-8

Rename keywords arguments variable to a default name.
---
 salt/modules/zypper.py | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/salt/modules/zypper.py b/salt/modules/zypper.py
index 53837e5e73..75e529c3f9 100644
--- a/salt/modules/zypper.py
+++ b/salt/modules/zypper.py
@@ -366,9 +366,9 @@ def info_installed(*names, **kwargs):
             summary, description.
 
     :param errors:
-        Handle RPM field errors (true|false). By default, various mistakes in 
the textual fields are simply ignored and
-        omitted from the data. Otherwise a field with a mistake is not 
returned, instead a 'N/A (bad UTF-8)'
-        (not available, broken) text is returned.
+        Handle RPM field errors. If 'ignore' is chosen, then various mistakes 
are simply ignored and omitted
+        from the texts or strings. If 'report' is chonen, then a field with a 
mistake is not returned, instead
+        a 'N/A (broken)' (not available, broken) text is placed.
 
         Valid attributes are:
             ignore, report
@@ -381,7 +381,8 @@ def info_installed(*names, **kwargs):
         salt '*' pkg.info_installed <package1> <package2> <package3> ...
         salt '*' pkg.info_installed <package1> attr=version,vendor
         salt '*' pkg.info_installed <package1> <package2> <package3> ... 
attr=version,vendor
-        salt '*' pkg.info_installed <package1> <package2> <package3> ... 
attr=version,vendor errors=true
+        salt '*' pkg.info_installed <package1> <package2> <package3> ... 
attr=version,vendor errors=ignore
+        salt '*' pkg.info_installed <package1> <package2> <package3> ... 
attr=version,vendor errors=report
     '''
     ret = dict()
     for pkg_name, pkg_nfo in __salt__['lowpkg.info'](*names, **kwargs).items():
@@ -395,7 +396,7 @@ def info_installed(*names, **kwargs):
                 else:
                     value_ = value.decode('UTF-8', 'ignore').encode('UTF-8', 
'ignore')
                 if value != value_:
-                    value = kwargs.get('errors') and value_ or 'N/A (invalid 
UTF-8)'
+                    value = kwargs.get('errors', 'ignore') == 'ignore' and 
value_ or 'N/A (invalid UTF-8)'
                     log.error('Package {0} has bad UTF-8 code in {1}: 
{2}'.format(pkg_name, key, value))
             if key == 'source_rpm':
                 t_nfo['source'] = value
-- 
2.11.0


++++++ do-not-generate-a-date-in-a-comment-to-prevent-rebui.patch ++++++
>From 7eeddadbf5ad309045b77762ac9f2f526af83b03 Mon Sep 17 00:00:00 2001
From: Michael Calmer <[email protected]>
Date: Fri, 4 Mar 2016 09:51:22 +0100
Subject: [PATCH] do not generate a date in a comment to prevent rebuilds
 (bsc#969407)

---
 setup.py | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/setup.py b/setup.py
index f9e9437e71..2356b2ada1 100755
--- a/setup.py
+++ b/setup.py
@@ -667,8 +667,7 @@ class Clean(clean):
 
 
 INSTALL_VERSION_TEMPLATE = '''\
-# This file was auto-generated by salt's setup on \
-{date:%A, %d %B %Y @ %H:%m:%S UTC}.
+# This file was auto-generated by salt's setup
 
 from salt.version import SaltStackVersion
 
-- 
2.11.0


++++++ fix-case-in-os_family-for-suse.patch ++++++
>From 036be5f7300bbf6c5ef3967b5cc935fd678cd1e1 Mon Sep 17 00:00:00 2001
From: Michael Calmer <[email protected]>
Date: Thu, 23 Feb 2017 12:01:05 +0100
Subject: [PATCH] fix case in os_family for Suse

---
 salt/modules/service.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/salt/modules/service.py b/salt/modules/service.py
index bb7133ee99..49186e4c9d 100644
--- a/salt/modules/service.py
+++ b/salt/modules/service.py
@@ -53,7 +53,7 @@ def __virtual__():
     if __grains__['kernel'] != 'Linux':
         return (False, 'Non Linux OSes are not supported')
     # SUSE >=12.0 uses systemd
-    if __grains__.get('os_family', '') == 'SUSE':
+    if __grains__.get('os_family', '') == 'Suse':
         try:
             # osrelease might be in decimal format (e.g. "12.1"), or for
             # SLES might include service pack (e.g. "11 SP3"), so split on
-- 
2.11.0


++++++ fix-regression-in-file.get_managed-add-unit-tests.patch ++++++
>From 89fd1a83d282a10728077a08466627271a052733 Mon Sep 17 00:00:00 2001
From: Erik Johnson <[email protected]>
Date: Wed, 1 Mar 2017 10:19:33 -0600
Subject: [PATCH] Fix regression in file.get_managed, add unit tests

This is no longer needed since we're invoking the state module directly
and not via the state compiler.

* Fix regression in file.get_managed when skip_verify=True
* Add integration tests for remote file sources
* Remove next(iter()) extraction
---
 salt/modules/file.py             |   6 +--
 salt/states/archive.py           |  11 ----
 tests/integration/states/file.py | 105 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 108 insertions(+), 14 deletions(-)

diff --git a/salt/modules/file.py b/salt/modules/file.py
index 8f0c6914b6..381800bc1a 100644
--- a/salt/modules/file.py
+++ b/salt/modules/file.py
@@ -3745,13 +3745,13 @@ def get_managed(
         if cached_dest and (source_hash or skip_verify):
             htype = source_sum.get('hash_type', 'sha256')
             cached_sum = get_hash(cached_dest, form=htype)
-            if cached_sum != source_sum['hsum']:
-                cache_refetch = True
-            elif skip_verify:
+            if skip_verify:
                 # prev: if skip_verify or cached_sum == source_sum['hsum']:
                 # but `cached_sum == source_sum['hsum']` is elliptical as prev 
if
                 sfn = cached_dest
                 source_sum = {'hsum': cached_sum, 'hash_type': htype}
+            elif cached_sum != source_sum['hsum']:
+                cache_refetch = True
 
         # If we didn't have the template or remote file, let's get it
         # Similarly when the file has been updated and the cache has to be 
refreshed
diff --git a/salt/states/archive.py b/salt/states/archive.py
index c5df213620..46146e971e 100644
--- a/salt/states/archive.py
+++ b/salt/states/archive.py
@@ -897,17 +897,6 @@ def extracted(name,
                 ret['comment'] = '\n'.join([str(x) for x in file_result])
             return ret
 
-        # Get actual state result. The state.single return is a single-element
-        # dictionary with the state's unique ID at the top level, and its value
-        # being the state's return dictionary. next(iter(dict_name)) will give
-        # us the value of the first key, so
-        # file_result[next(iter(file_result))] will give us the results of the
-        # state.single we just ran.
-        try:
-            file_result = file_result[next(iter(file_result))]
-        except AttributeError:
-            pass
-
         try:
             if not file_result['result']:
                 log.debug('failed to download {0}'.format(source_match))
diff --git a/tests/integration/states/file.py b/tests/integration/states/file.py
index d63f318064..faa83d00e8 100644
--- a/tests/integration/states/file.py
+++ b/tests/integration/states/file.py
@@ -9,15 +9,22 @@ from __future__ import absolute_import
 from distutils.version import LooseVersion
 import errno
 import glob
+import logging
 import os
 import re
 import sys
 import shutil
+import socket
 import stat
 import tempfile
 import textwrap
+import threading
+import tornado.ioloop
+import tornado.web
 import filecmp
 
+log = logging.getLogger(__name__)
+
 # Import 3rd-party libs
 from salt.ext.six.moves import range  # pylint: 
disable=import-error,redefined-builtin
 
@@ -2392,6 +2399,104 @@ class FileTest(integration.ModuleCase, 
integration.SaltReturnAssertsMixIn):
             if check_file:
                 self.run_function('file.remove', [file])
 
+
+PORT = 9999
+FILE_SOURCE = 'http://localhost:{0}/grail/scene33'.format(PORT)
+FILE_HASH = 'd2feb3beb323c79fc7a0f44f1408b4a3'
+STATE_DIR = os.path.join(integration.FILES, 'file', 'base')
+
+
+class RemoteFileTest(integration.ModuleCase, 
integration.SaltReturnAssertsMixIn):
+    '''
+    Uses a local tornado webserver to test http(s) file.managed states with and
+    without skip_verify
+    '''
+    @classmethod
+    def webserver(cls):
+        '''
+        method to start tornado static web app
+        '''
+        application = tornado.web.Application([
+            (r'/(.*)', tornado.web.StaticFileHandler, {'path': STATE_DIR})
+        ])
+        application.listen(PORT)
+        tornado.ioloop.IOLoop.instance().start()
+
+    @classmethod
+    def setUpClass(cls):
+        '''
+        start tornado app on thread and wait until it is running
+        '''
+        cls.server_thread = threading.Thread(target=cls.webserver)
+        cls.server_thread.daemon = True
+        cls.server_thread.start()
+        # check if tornado app is up
+        port_closed = True
+        while port_closed:
+            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            result = sock.connect_ex(('127.0.0.1', PORT))
+            if result == 0:
+                port_closed = False
+
+    @classmethod
+    def tearDownClass(cls):
+        tornado.ioloop.IOLoop.instance().stop()
+        cls.server_thread.join()
+
+    def setUp(self):
+        fd_, self.name = tempfile.mkstemp(dir=integration.TMP)
+        try:
+            os.close(fd_)
+        except OSError as exc:
+            if exc.errno != errno.EBADF:
+                raise exc
+        # Remove the file that mkstemp just created so that the states can test
+        # creating a new file instead of a diff from a zero-length file.
+        self.tearDown()
+
+    def tearDown(self):
+        try:
+            os.remove(self.name)
+        except OSError as exc:
+            if exc.errno != errno.ENOENT:
+                raise exc
+
+    def test_file_managed_http_source_no_hash(self):
+        '''
+        Test a remote file with no hash
+        '''
+        ret = self.run_state('file.managed',
+                             name=self.name,
+                             source=FILE_SOURCE,
+                             skip_verify=False)
+        log.debug('ret = %s', ret)
+        # This should fail because no hash was provided
+        self.assertSaltFalseReturn(ret)
+
+    def test_file_managed_http_source(self):
+        '''
+        Test a remote file with no hash
+        '''
+        ret = self.run_state('file.managed',
+                             name=self.name,
+                             source=FILE_SOURCE,
+                             source_hash=FILE_HASH,
+                             skip_verify=False)
+        log.debug('ret = %s', ret)
+        self.assertSaltTrueReturn(ret)
+
+    def test_file_managed_http_source_skip_verify(self):
+        '''
+        Test a remote file using skip_verify
+        '''
+        ret = self.run_state('file.managed',
+                             name=self.name,
+                             source=FILE_SOURCE,
+                             skip_verify=True)
+        log.debug('ret = %s', ret)
+        self.assertSaltTrueReturn(ret)
+
+
 if __name__ == '__main__':
     from integration import run_tests
     run_tests(FileTest)
-- 
2.11.0


++++++ fix-salt-summary-to-count-not-responding-minions-cor.patch ++++++
>From 54fa5d2b6d47d242e98e9a7f4cc597e03084d4d2 Mon Sep 17 00:00:00 2001
From: Michael Calmer <[email protected]>
Date: Tue, 21 Jun 2016 13:12:48 +0200
Subject: [PATCH] fix salt --summary to count not responding minions
 correctly (bsc#972311)

In case a minion is not responding a dict is returned instead of a string.
---
 salt/cli/salt.py | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/salt/cli/salt.py b/salt/cli/salt.py
index 1fc9a83508..88ac65e7c2 100644
--- a/salt/cli/salt.py
+++ b/salt/cli/salt.py
@@ -281,7 +281,9 @@ class SaltCMD(parsers.SaltCMDOptionParser):
         not_connected_minions = []
         failed_minions = []
         for each_minion in ret:
-            minion_ret = ret[each_minion].get('ret')
+            minion_ret = ret[each_minion]
+            if (isinstance(minion_ret, dict) and 'ret' in minion_ret):
+                minion_ret = ret[each_minion].get('ret')
             if (
                     isinstance(minion_ret, string_types)
                     and minion_ret.startswith("Minion did not return")
-- 
2.11.0


++++++ run-salt-api-as-user-salt-bsc-990029.patch ++++++
>From 7bbbd3b6ebaf3988a4f97b905040b56be065f201 Mon Sep 17 00:00:00 2001
From: Michael Calmer <[email protected]>
Date: Fri, 29 Jul 2016 10:50:21 +0200
Subject: [PATCH] Run salt-api as user salt (bsc#990029)

---
 pkg/salt-api.service | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pkg/salt-api.service b/pkg/salt-api.service
index c3e67d510c..9be2cb8ee6 100644
--- a/pkg/salt-api.service
+++ b/pkg/salt-api.service
@@ -3,8 +3,8 @@ Description=The Salt API
 After=network.target
 
 [Service]
-Type=notify
-NotifyAccess=all
+User=salt
+Type=simple
 LimitNOFILE=8192
 ExecStart=/usr/bin/salt-api
 TimeoutStopSec=3
-- 
2.11.0


++++++ run-salt-master-as-dedicated-salt-user.patch ++++++
>From d1d0fec1dd0fbf6a67c313718975ceb72c10cd2f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Klaus=20K=C3=A4mpf?= <[email protected]>
Date: Wed, 20 Jan 2016 11:01:06 +0100
Subject: [PATCH] Run salt master as dedicated salt user

---
 conf/master               | 3 ++-
 pkg/salt-common.logrotate | 3 +++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/conf/master b/conf/master
index 3930c9832d..f58eb496bf 100644
--- a/conf/master
+++ b/conf/master
@@ -25,7 +25,8 @@
 # permissions to allow the specified user to run the master. The exception is
 # the job cache, which must be deleted if this user is changed. If the
 # modified files cause conflicts, set verify_env to False.
-#user: root
+user: salt
+syndic_user: salt
 
 # The port used by the communication interface. The ret (return) port is the
 # interface used for the file server, authentication, job returns, etc.
diff --git a/pkg/salt-common.logrotate b/pkg/salt-common.logrotate
index 3cd002308e..8d970c0a64 100644
--- a/pkg/salt-common.logrotate
+++ b/pkg/salt-common.logrotate
@@ -1,4 +1,5 @@
 /var/log/salt/master {
+       su salt salt
        weekly
        missingok
        rotate 7
@@ -7,6 +8,7 @@
 }
 
 /var/log/salt/minion {
+       su salt salt
        weekly
        missingok
        rotate 7
@@ -15,6 +17,7 @@
 }
 
 /var/log/salt/key {
+       su salt salt
        weekly
        missingok
        rotate 7
-- 
2.11.0


++++++ salt-2016.3.4.tar.gz -> salt-2016.11.3.tar.gz ++++++
/work/SRC/openSUSE:Factory/salt/salt-2016.3.4.tar.gz 
/work/SRC/openSUSE:Factory/.salt.new/salt-2016.11.3.tar.gz differ: char 5, line 
1

++++++ setting-up-os-grains-for-sles-expanded-support-suse-.patch ++++++
>From 5a07f204d45b2b86d8bc0279527723e030cc4e21 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
 <[email protected]>
Date: Fri, 30 Sep 2016 13:06:52 +0100
Subject: [PATCH] Setting up OS grains for SLES Expanded Support (SUSE's
 Red Hat compatible platform)

core.py: quote style fixed
---
 salt/grains/core.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/salt/grains/core.py b/salt/grains/core.py
index 6a42cc734f..fce35cb313 100644
--- a/salt/grains/core.py
+++ b/salt/grains/core.py
@@ -1049,6 +1049,7 @@ _OS_NAME_MAP = {
     'sles': 'SUSE',
     'slesexpand': 'RES',
     'void': 'Void',
+    'slesexpand': 'RES',
     'linuxmint': 'Mint',
 }
 
-- 
2.11.0


++++++ translate-variable-arguments-if-they-contain-hidden-.patch ++++++
>From 7313bf5574a72557a6389b9a991316d0b2c6f848 Mon Sep 17 00:00:00 2001
From: Michael Calmer <[email protected]>
Date: Wed, 1 Mar 2017 15:37:04 +0100
Subject: [PATCH] translate variable arguments if they contain hidden
 keywords (bsc#1025896)

- includes a test
---
 salt/states/module.py            | 30 ++++++++++++++++++++++--------
 tests/unit/states/module_test.py | 14 ++++++++++++++
 2 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/salt/states/module.py b/salt/states/module.py
index 686546832f..adc6e12c9d 100644
--- a/salt/states/module.py
+++ b/salt/states/module.py
@@ -218,16 +218,30 @@ def run(name, **kwargs):
         ret['result'] = False
         return ret
 
-    if aspec.varargs and aspec.varargs in kwargs:
-        varargs = kwargs.pop(aspec.varargs)
+    if aspec.varargs:
+        if aspec.varargs == 'name':
+            rarg = 'm_name'
+        elif aspec.varargs == 'fun':
+            rarg = 'm_fun'
+        elif aspec.varargs == 'names':
+            rarg = 'm_names'
+        elif aspec.varargs == 'state':
+            rarg = 'm_state'
+        elif aspec.varargs == 'saltenv':
+            rarg = 'm_saltenv'
+        else:
+            rarg = aspec.varargs
 
-        if not isinstance(varargs, list):
-            msg = "'{0}' must be a list."
-            ret['comment'] = msg.format(aspec.varargs)
-            ret['result'] = False
-            return ret
+        if rarg in kwargs:
+            varargs = kwargs.pop(rarg)
+
+            if not isinstance(varargs, list):
+                msg = "'{0}' must be a list."
+                ret['comment'] = msg.format(aspec.varargs)
+                ret['result'] = False
+                return ret
 
-        args.extend(varargs)
+            args.extend(varargs)
 
     nkwargs = {}
     if aspec.keywords and aspec.keywords in kwargs:
diff --git a/tests/unit/states/module_test.py b/tests/unit/states/module_test.py
index 0c025e3861..20dda73938 100644
--- a/tests/unit/states/module_test.py
+++ b/tests/unit/states/module_test.py
@@ -38,6 +38,10 @@ class ModuleStateTest(TestCase):
                     varargs=None,
                     keywords=None,
                     defaults=False)
+    bspec = ArgSpec(args=[],
+                    varargs='names',
+                    keywords='kwargs',
+                    defaults=None)
 
     def test_module_run_module_not_available(self):
         '''
@@ -69,6 +73,16 @@ class ModuleStateTest(TestCase):
         comment = 'The following arguments are missing: world hello'
         self.assertEqual(ret['comment'], comment)
 
+    @patch('salt.utils.args.get_function_argspec', 
MagicMock(return_value=bspec))
+    def test_module_run_hidden_varargs(self):
+        '''
+        Tests the return of module.run state when hidden varargs are used with
+        wrong type.
+        '''
+        ret = module.run(CMD, m_names = 'anyname')
+        comment = "'names' must be a list."
+        self.assertEqual(ret['comment'], comment)
+
 
 if __name__ == '__main__':
     from integration import run_tests
-- 
2.11.0


++++++ tserong-suse.com-we-don-t-have-python-systemd-so-not.patch ++++++
>From a9f1be35b0c158fcdd460dcc8c501fe039d97258 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Klaus=20K=C3=A4mpf?= <[email protected]>
Date: Wed, 20 Jan 2016 11:00:15 +0100
Subject: [PATCH] [email protected] -- We don't have python-systemd, so
 notify can't work

---
 pkg/salt-master.service | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/pkg/salt-master.service b/pkg/salt-master.service
index 1f4650f872..59be50301a 100644
--- a/pkg/salt-master.service
+++ b/pkg/salt-master.service
@@ -4,8 +4,7 @@ After=network.target
 
 [Service]
 LimitNOFILE=16384
-Type=notify
-NotifyAccess=all
+Type=simple
 ExecStart=/usr/bin/salt-master
 
 [Install]
-- 
2.11.0



Reply via email to