From a3c02e1fa5b7604a0f184f405500380763bd4085 Mon Sep 17 00:00:00 2001 From: Justin Findlay Date: Tue, 25 Nov 2014 15:29:16 -0700 Subject: [PATCH 001/115] quote strs in virtualenv mod --- salt/modules/virtualenv_mod.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/salt/modules/virtualenv_mod.py b/salt/modules/virtualenv_mod.py index 3c390e21f0..ba06ebeb77 100644 --- a/salt/modules/virtualenv_mod.py +++ b/salt/modules/virtualenv_mod.py @@ -9,6 +9,10 @@ import shutil import logging import os import os.path +try: + from shlex import quote as _cmd_quote # pylint: disable=E0611 +except ImportError: + from pipes import quote as _cmd_quote # Import salt libs import salt.utils @@ -122,7 +126,7 @@ def create(path, elif runas is not None and not user: user = str(runas) - cmd = [venv_bin] + cmd = [_cmd_quote(venv_bin)] if 'pyvenv' not in venv_bin: # ----- Stop the user if pyvenv only options are used ---------------> @@ -150,7 +154,7 @@ def create(path, ) except ImportError: # Unable to import?? Let's parse the version from the console - version_cmd = '{0} --version'.format(venv_bin) + version_cmd = '{0} --version'.format(_cmd_quote(venv_bin)) ret = __salt__['cmd.run_all'](version_cmd, runas=user) if ret['retcode'] > 0 or not ret['stdout'].strip(): raise salt.exceptions.CommandExecutionError( @@ -179,7 +183,7 @@ def create(path, 'Requested python ({0}) does not appear ' 'executable.'.format(python) ) - cmd.append('--python={0}'.format(python)) + cmd.append('--python={0}'.format(_cmd_quote(python))) if extra_search_dir is not None: if isinstance(extra_search_dir, string_types) and \ extra_search_dir.strip() != '': @@ -187,7 +191,7 @@ def create(path, e.strip() for e in extra_search_dir.split(',') ] for entry in extra_search_dir: - cmd.append('--extra-search-dir={0}'.format(entry)) + cmd.append('--extra-search-dir={0}'.format(_cmd_quote(entry))) if never_download is True: if virtualenv_version_info >= (1, 10): log.info( @@ -199,7 +203,7 @@ def create(path, else: cmd.append('--never-download') if prompt is not None and prompt.strip() != '': - cmd.append('--prompt={0!r}'.format(prompt)) + cmd.append('--prompt={0!r}'.format(_cmd_quote(prompt))) else: # venv module from the Python >= 3.3 standard library @@ -240,7 +244,7 @@ def create(path, cmd.append('--system-site-packages') # Finally the virtualenv path - cmd.append(path) + cmd.append(_cmd_quote(path)) # Let's create the virtualenv ret = __salt__['cmd.run_all'](' '.join(cmd), runas=user) @@ -306,7 +310,7 @@ def get_site_packages(venv): raise salt.exceptions.CommandExecutionError( "Path does not appear to be a virtualenv: '{0}'".format(bin_path)) - return __salt__['cmd.exec_code'](bin_path, + return __salt__['cmd.exec_code'](_cmd_quote(bin_path), 'from distutils import sysconfig; print sysconfig.get_python_lib()') @@ -323,7 +327,7 @@ def _install_script(source, cwd, python, user, saltenv='base'): os.chown(tmppath, __salt__['file.user_to_uid'](user), -1) try: return __salt__['cmd.run_all']( - '{0} {1}'.format(python, tmppath), + '{0} {1}'.format(_cmd_quote(python), _cmd_quote(tmppath)), runas=user, cwd=cwd, env={'VIRTUAL_ENV': cwd} From 0e2e4b9e2e69b20554e9a8ee6229be6cc835aaf1 Mon Sep 17 00:00:00 2001 From: Adam Mendlik Date: Tue, 25 Nov 2014 15:29:53 -0700 Subject: [PATCH 002/115] Handle highstate output when the result is a dict --- salt/output/highstate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/output/highstate.py b/salt/output/highstate.py index 92d111aba9..be41c7eb2a 100644 --- a/salt/output/highstate.py +++ b/salt/output/highstate.py @@ -99,7 +99,7 @@ def _format_host(host, data): data = _strip_clean(data) # Verify that the needed data is present for tname, info in data.items(): - if '__run_num__' not in info: + if isinstance(info, dict) and '__run_num__' not in info: err = (u'The State execution failed to record the order ' 'in which all states were executed. The state ' 'return missing data is:') From 295db0c8cdfe9373e421f1b80fdf6805ba926832 Mon Sep 17 00:00:00 2001 From: Adam Mendlik Date: Tue, 25 Nov 2014 22:00:35 -0700 Subject: [PATCH 003/115] Properly output the results of salt.function states --- salt/output/highstate.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/salt/output/highstate.py b/salt/output/highstate.py index be41c7eb2a..1f1574b597 100644 --- a/salt/output/highstate.py +++ b/salt/output/highstate.py @@ -82,6 +82,14 @@ def _format_host(host, data): hstrs = [] nchanges = 0 strip_colors = __opts__.get('strip_colors', True) + + if isinstance(data, int) or isinstance(data, str): + # Data in this format is from saltmod.function, + # so it is always a 'change' + nchanges = 1 + hstrs.append((u'{0} {1}{2[ENDC]}' + .format(hcolor, data, colors))) + hcolor = colors['CYAN'] # Print the minion name in cyan if isinstance(data, list): # Errors have been detected, list them in RED! hcolor = colors['RED_BOLD'] From 0723b24feb0af3efbde61f22471e41400e3880b8 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:39:18 +0000 Subject: [PATCH 004/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py index dba5cc9890..360954e12f 100644 --- a/tests/integration/__init__.py +++ b/tests/integration/__init__.py @@ -396,7 +396,7 @@ class TestDaemon(object): if keygen_ed25519_err: print('ssh-keygen had errors: {0}'.format(keygen_ed25519_err)) - with open(os.path.join(TMP_CONF_DIR, 'sshd_config'), 'a') as ssh_config: + with salt.utils.fopen(os.path.join(TMP_CONF_DIR, 'sshd_config'), 'a') as ssh_config: ssh_config.write('AuthorizedKeysFile {0}\n'.format(auth_key_file)) ssh_config.write('HostKey {0}\n'.format(server_dsa_priv_key_file)) ssh_config.write('HostKey {0}\n'.format(server_ecdsa_priv_key_file)) @@ -415,7 +415,7 @@ class TestDaemon(object): print('sshd had errors on startup: {0}'.format(sshd_err)) roster_path = os.path.join(FILES, 'conf/_ssh/roster') shutil.copy(roster_path, TMP_CONF_DIR) - with open(os.path.join(TMP_CONF_DIR, 'roster'), 'a') as roster: + with salt.utils.fopen(os.path.join(TMP_CONF_DIR, 'roster'), 'a') as roster: roster.write(' user: {0}\n'.format(pwd.getpwuid(os.getuid()).pw_name)) roster.write(' priv: {0}/{1}'.format(TMP_CONF_DIR, 'key_test')) @@ -540,7 +540,7 @@ class TestDaemon(object): for entry in ('master', 'minion', 'sub_minion', 'syndic_master'): computed_config = copy.deepcopy(locals()['{0}_opts'.format(entry)]) - open(os.path.join(TMP_CONF_DIR, entry), 'w').write( + salt.utils.fopen(os.path.join(TMP_CONF_DIR, entry), 'w').write( yaml.dump(computed_config, default_flow_style=False) ) # <---- Transcribe Configuration ----------------------------------------------------------------------------- From 5dfddc88a493aa12ed92cebf37cb5ae54f11db72 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:39:49 +0000 Subject: [PATCH 005/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/client/standard.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/integration/client/standard.py b/tests/integration/client/standard.py index 830fe84366..48da7996d2 100644 --- a/tests/integration/client/standard.py +++ b/tests/integration/client/standard.py @@ -1,12 +1,15 @@ # -*- coding: utf-8 -*- +# Import python libs +import os + # Import Salt Testing libs from salttesting.helpers import ensure_in_syspath ensure_in_syspath('../../') # Import salt libs import integration -import os +import salt.utils class StdTest(integration.ModuleCase): @@ -41,7 +44,7 @@ class StdTest(integration.ModuleCase): # create fake mininion key_file = os.path.join(self.master_opts['pki_dir'], 'minions', 'footest') # touch the file - open(key_file, 'a').close() + salt.utils.fopen(key_file, 'a').close() # ping that minion and ensure it times out try: cmd_iter = self.client.cmd_cli( From 6b72255e9b515ec57c76154edbba94bcc20458aa Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:46:13 +0000 Subject: [PATCH 006/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/modules/darwin_sysctl.py | 40 +++++++++------------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/tests/integration/modules/darwin_sysctl.py b/tests/integration/modules/darwin_sysctl.py index 227bc99b09..0d49a854df 100644 --- a/tests/integration/modules/darwin_sysctl.py +++ b/tests/integration/modules/darwin_sysctl.py @@ -9,7 +9,7 @@ import random # Import Salt Libs import integration -from salt.utils import mkstemp, fopen +import salt.utils from salt.exceptions import CommandExecutionError # Import Salt Testing Libs @@ -155,16 +155,12 @@ class DarwinSysctlModuleTest(integration.ModuleCase): file will be restored in tearDown ''' # Create new temporary file path and open needed files - org_conf = fopen(CONFIG, 'r') - temp_path = mkstemp() - temp_sysconf = open(temp_path, 'w') - - # write sysctl lines to temp file - for line in org_conf: - temp_sysconf.write(line) - org_conf.close() - temp_sysconf.close() - + temp_path = salt.utils.mkstemp() + with salt.utils.fopen(CONFIG, 'r') as org_conf: + with salt.utils.fopen(temp_path, 'w') as temp_sysconf: + # write sysctl lines to temp file + for line in org_conf: + temp_sysconf.write(line) return temp_path def __restore_sysctl(self): @@ -174,14 +170,12 @@ class DarwinSysctlModuleTest(integration.ModuleCase): # If sysctl testing file exists, delete it if os.path.isfile(CONFIG): os.remove(CONFIG) - temp_sysctl = open(self.conf, 'r') - sysctl = open(CONFIG, 'w') # write temp lines to sysctl file to restore - for line in temp_sysctl: - sysctl.write(line) - temp_sysctl.close() - sysctl.close() + with salt.utils.fopen(self.conf, 'r') as temp_sysctl: + with salt.utils.fopen(CONFIG, 'w') as sysctl: + for line in temp_sysctl: + sysctl.write(line) # delete temporary file os.remove(self.conf) @@ -190,13 +184,11 @@ class DarwinSysctlModuleTest(integration.ModuleCase): ''' Returns True if given line is present in file ''' - f_in = open(conf_file, 'r') - for line in f_in: - if to_find in line: - f_in.close() - return True - f_in.close() - return False + with salt.utils.fopen(conf_file, 'r') as f_in: + for line in f_in: + if to_find in line: + return True + return False @destructiveTest @skipIf(os.geteuid() != 0, 'You must be logged in as root to run this test') From 2a597da207b0678cd706829edbf5295b263f3def Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:47:05 +0000 Subject: [PATCH 007/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/modules/pip.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/modules/pip.py b/tests/integration/modules/pip.py index ea55172acf..f37e81e94e 100644 --- a/tests/integration/modules/pip.py +++ b/tests/integration/modules/pip.py @@ -67,9 +67,9 @@ class PipModuleTest(integration.ModuleCase): # Create a requirements file that depends on another one. req1_filename = os.path.join(self.venv_dir, 'requirements.txt') req2_filename = os.path.join(self.venv_dir, 'requirements2.txt') - with open(req1_filename, 'wb') as f: + with salt.utils.fopen(req1_filename, 'wb') as f: f.write('-r requirements2.txt') - with open(req2_filename, 'wb') as f: + with salt.utils.fopen(req2_filename, 'wb') as f: f.write('pep8') this_user = pwd.getpwuid(os.getuid())[0] From 753338e078127df8469fe44ba17309cb3fa6bf2f Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:49:27 +0000 Subject: [PATCH 008/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/call.py | 34 ++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/tests/integration/shell/call.py b/tests/integration/shell/call.py index e2e9dedbc5..749e6a14ac 100644 --- a/tests/integration/shell/call.py +++ b/tests/integration/shell/call.py @@ -22,6 +22,7 @@ ensure_in_syspath('../../') # Import salt libs import integration +import salt.utils class CallTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): @@ -164,9 +165,10 @@ class CallTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): start = datetime.now() # Let's first test with a master running - open(minion_config_file, 'w').write( - yaml.dump(minion_config, default_flow_style=False) - ) + with salt.utils.fopen(minion_config_file, 'w') as fh_: + fh_.write( + yaml.dump(minion_config, default_flow_style=False) + ) ret = self.run_script( 'salt-call', '--config-dir {0} cmd.run "echo foo"'.format( @@ -193,9 +195,10 @@ class CallTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): # Now let's remove the master configuration minion_config.pop('master') minion_config.pop('master_port') - open(minion_config_file, 'w').write( - yaml.dump(minion_config, default_flow_style=False) - ) + with salt.utils.fopen(minion_config_file, 'w') as fh_: + fh_.write( + yaml.dump(minion_config, default_flow_style=False) + ) out = self.run_script( 'salt-call', @@ -240,9 +243,10 @@ class CallTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): # Should work with local file client minion_config['file_client'] = 'local' - open(minion_config_file, 'w').write( - yaml.dump(minion_config, default_flow_style=False) - ) + with salt.utils.fopen(minion_config_file, 'w') as fh_: + fh_.write( + yaml.dump(minion_config, default_flow_style=False) + ) ret = self.run_script( 'salt-call', '--config-dir {0} cmd.run "echo foo"'.format( @@ -267,13 +271,13 @@ class CallTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): os.chdir(config_dir) - minion_config = yaml.load( - open(self.get_config_file_path('minion'), 'r').read() - ) + with salt.utils.fopen(self.get_config_file_path('minion'), 'r') as fh_: + minion_config = yaml.load(fh_.read()) minion_config['log_file'] = 'file:///dev/log/LOG_LOCAL3' - open(os.path.join(config_dir, 'minion'), 'w').write( - yaml.dump(minion_config, default_flow_style=False) - ) + with salt.utils.fopen(os.path.join(config_dir, 'minion'), 'w') as fh_: + fh_.write( + yaml.dump(minion_config, default_flow_style=False) + ) ret = self.run_script( 'salt-call', '--config-dir {0} cmd.run "echo foo"'.format( From 9230f5b5ee1c706a9468d65d40f6adab310ef1c9 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:50:47 +0000 Subject: [PATCH 009/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/cp.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/integration/shell/cp.py b/tests/integration/shell/cp.py index 6af7014f2d..a794e1dfc6 100644 --- a/tests/integration/shell/cp.py +++ b/tests/integration/shell/cp.py @@ -45,7 +45,8 @@ class CopyTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): 'files', 'file', 'base', 'testfile' ) ) - testfile_contents = salt.utils.fopen(testfile, 'r').read() + with salt.utils.fopen(testfile, 'r') as fh_: + testfile_contents = fh_.read() for idx, minion in enumerate(minions): ret = self.run_salt( @@ -122,12 +123,13 @@ class CopyTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): config_file_name = 'master' config = yaml.load( - open(self.get_config_file_path(config_file_name), 'r').read() + salt.utils.fopen(self.get_config_file_path(config_file_name), 'r').read() ) config['log_file'] = 'file:///dev/log/LOG_LOCAL3' - open(os.path.join(config_dir, config_file_name), 'w').write( - yaml.dump(config, default_flow_style=False) - ) + with salt.utils.fopen(os.path.join(config_dir, config_file_name), 'w') as fh_: + fh_.write( + yaml.dump(config, default_flow_style=False) + ) ret = self.run_script( self._call_binary_, From 2127a98667944561647ac7f68443c4cfb9e93d3c Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:52:46 +0000 Subject: [PATCH 010/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/key.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/integration/shell/key.py b/tests/integration/shell/key.py index 23e57f24e0..7d76dccc2f 100644 --- a/tests/integration/shell/key.py +++ b/tests/integration/shell/key.py @@ -13,6 +13,7 @@ ensure_in_syspath('../../') # Import salt libs import integration +import salt.utils class KeyTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): @@ -231,13 +232,13 @@ class KeyTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): os.chdir(config_dir) config_file_name = 'master' - config = yaml.load( - open(self.get_config_file_path(config_file_name), 'r').read() - ) - config['log_file'] = 'file:///dev/log/LOG_LOCAL3' - open(os.path.join(config_dir, config_file_name), 'w').write( - yaml.dump(config, default_flow_style=False) - ) + with salt.utils.fopen(self.get_config_file_path(config_file_name), 'r') as fhr: + config = yaml.load(fhr.ready()) + config['log_file'] = 'file:///dev/log/LOG_LOCAL3' + with salt.utils.fopen(os.path.join(config_dir, config_file_name), 'w') as fhw: + fhw.write( + yaml.dump(config, default_flow_style=False) + ) ret = self.run_script( self._call_binary_, '--config-dir {0} -L'.format( From 32b2f2e05f64af4b42bf083cd56c9b555960ecbf Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:54:29 +0000 Subject: [PATCH 011/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/master.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/tests/integration/shell/master.py b/tests/integration/shell/master.py index 0624842f76..57e1518922 100644 --- a/tests/integration/shell/master.py +++ b/tests/integration/shell/master.py @@ -19,6 +19,7 @@ ensure_in_syspath('../../') # Import salt libs import integration +import salt.utils class MasterTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): @@ -35,17 +36,17 @@ class MasterTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): config_file_name = 'master' pid_path = os.path.join(config_dir, '{0}.pid'.format(config_file_name)) - config = yaml.load( - open(self.get_config_file_path(config_file_name), 'r').read() - ) - config['root_dir'] = config_dir - config['log_file'] = 'file:///tmp/log/LOG_LOCAL3' - config['ret_port'] = config['ret_port'] + 10 - config['publish_port'] = config['publish_port'] + 10 + with salt.utils.fopen(self.get_config_file_path(config_file_name), 'r') as fhr: + config = yaml.load(fhr.read()) + config['root_dir'] = config_dir + config['log_file'] = 'file:///tmp/log/LOG_LOCAL3' + config['ret_port'] = config['ret_port'] + 10 + config['publish_port'] = config['publish_port'] + 10 - open(os.path.join(config_dir, config_file_name), 'w').write( - yaml.dump(config, default_flow_style=False) - ) + with salt.utils.fopen(os.path.join(config_dir, config_file_name), 'w') as fhw: + fhw.write( + yaml.dump(config, default_flow_style=False) + ) ret = self.run_script( self._call_binary_, From 46ea34b4f541003d786b8537ed13175a9e517991 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:55:30 +0000 Subject: [PATCH 012/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/minion.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/integration/shell/minion.py b/tests/integration/shell/minion.py index c52a936bf6..bee376084d 100644 --- a/tests/integration/shell/minion.py +++ b/tests/integration/shell/minion.py @@ -19,6 +19,7 @@ ensure_in_syspath('../../') # Import salt libs import integration +import salt.utils class MinionTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): @@ -35,14 +36,14 @@ class MinionTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): config_file_name = 'minion' pid_path = os.path.join(config_dir, '{0}.pid'.format(config_file_name)) - config = yaml.load( - open(self.get_config_file_path(config_file_name), 'r').read() - ) - config['log_file'] = 'file:///tmp/log/LOG_LOCAL3' + with salt.utils.fopen(self.get_config_file_path(config_file_name), 'r') as fhr: + config = yaml.load(fhr.read()) + config['log_file'] = 'file:///tmp/log/LOG_LOCAL3' - open(os.path.join(config_dir, config_file_name), 'w').write( - yaml.dump(config, default_flow_style=False) - ) + with salt.utils.fopen(os.path.join(config_dir, config_file_name), 'w') as fhw: + fhw.write( + yaml.dump(config, default_flow_style=False) + ) ret = self.run_script( self._call_binary_, From 70b657af205a89ecde400904dcf195cce9407639 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:56:43 +0000 Subject: [PATCH 013/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/runner.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/integration/shell/runner.py b/tests/integration/shell/runner.py index 56df29d86a..302bd8a027 100644 --- a/tests/integration/shell/runner.py +++ b/tests/integration/shell/runner.py @@ -15,6 +15,7 @@ ensure_in_syspath('../../') # Import salt libs import integration +import salt.utils class RunTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): @@ -62,13 +63,13 @@ class RunTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): os.chdir(config_dir) config_file_name = 'master' - config = yaml.load( - open(self.get_config_file_path(config_file_name), 'r').read() - ) - config['log_file'] = 'file:///dev/log/LOG_LOCAL3' - open(os.path.join(config_dir, config_file_name), 'w').write( - yaml.dump(config, default_flow_style=False) - ) + with salt.utils.fopen(self.get_config_file_path(config_file_name), 'r') as fhr: + config = yaml.load(fhr.read()) + config['log_file'] = 'file:///dev/log/LOG_LOCAL3' + with salt.utils.fopen(os.path.join(config_dir, config_file_name), 'w') as fhw: + fhw.write( + yaml.dump(config, default_flow_style=False) + ) ret = self.run_script( self._call_binary_, '--config-dir {0} -d'.format( From d27c38d28f8ca33a807c4af259e937641e7858b0 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:57:57 +0000 Subject: [PATCH 014/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/syndic.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tests/integration/shell/syndic.py b/tests/integration/shell/syndic.py index 4f862fd636..82de5b7381 100644 --- a/tests/integration/shell/syndic.py +++ b/tests/integration/shell/syndic.py @@ -19,6 +19,7 @@ ensure_in_syspath('../../') # Import salt libs import integration +import salt.utils class SyndicTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): @@ -35,18 +36,18 @@ class SyndicTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): for fname in ('master', 'minion'): pid_path = os.path.join(config_dir, '{0}.pid'.format(fname)) - config = yaml.load( - open(self.get_config_file_path(fname), 'r').read() - ) - config['log_file'] = config['syndic_log_file'] = 'file:///tmp/log/LOG_LOCAL3' - config['root_dir'] = config_dir - if 'ret_port' in config: - config['ret_port'] = int(config['ret_port']) + 10 - config['publish_port'] = int(config['publish_port']) + 10 + with salt.utils.fopen(self.get_config_file_path(fname), 'r') as fhr: + config = yaml.load(fhr.read()) + config['log_file'] = config['syndic_log_file'] = 'file:///tmp/log/LOG_LOCAL3' + config['root_dir'] = config_dir + if 'ret_port' in config: + config['ret_port'] = int(config['ret_port']) + 10 + config['publish_port'] = int(config['publish_port']) + 10 - open(os.path.join(config_dir, fname), 'w').write( - yaml.dump(config, default_flow_style=False) - ) + with salt.utils.fopen(os.path.join(config_dir, fname), 'w') as fhw: + fhw.write( + yaml.dump(config, default_flow_style=False) + ) ret = self.run_script( self._call_binary_, From ea717d2422a6b730e9aaf7c8c615dca2a2ba8ad3 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 17:59:52 +0000 Subject: [PATCH 015/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/states/compiler.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/integration/states/compiler.py b/tests/integration/states/compiler.py index ffbf229c95..056d87dc03 100644 --- a/tests/integration/states/compiler.py +++ b/tests/integration/states/compiler.py @@ -55,7 +55,8 @@ class CompileTest(integration.ModuleCase): ] try: ret = self.run_function('state.template_str', ['\n'.join(template)], timeout=120) - self.assertEqual('base', open(managed_file).read()) + with salt.utils.fopen(managed_file) as fhr: + self.assertEqual('base', fhr.read()) finally: if os.path.isfile(managed_file): os.unlink(managed_file) @@ -69,7 +70,8 @@ class CompileTest(integration.ModuleCase): ] try: ret = self.run_function('state.template_str', ['\n'.join(template)], timeout=120) - self.assertEqual('base', open(managed_file).read()) + with salt.utils.fopen(managed_file) as fhr: + self.assertEqual('base', fhr.read()) finally: if os.path.isfile(managed_file): os.unlink(managed_file) From b5cda75a8ce21cc22430b2ec8f4fc8ede7ee941f Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:01:35 +0000 Subject: [PATCH 016/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/states/ssh.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/tests/integration/states/ssh.py b/tests/integration/states/ssh.py index 10be18eaa1..a7bc046efb 100644 --- a/tests/integration/states/ssh.py +++ b/tests/integration/states/ssh.py @@ -182,11 +182,12 @@ class SSHAuthStateTests(integration.ModuleCase, self.assertSaltStateChangesEqual( ret, {'AAAAB3NzaC1kcQ9J5bYTEyZ==': 'New'} ) - self.assertEqual( - open(authorized_keys_file, 'r').read(), - 'ssh-rsa AAAAB3NzaC1kc3MAAACBAL0sQ9fJ5bYTEyY== root\n' - 'ssh-rsa AAAAB3NzaC1kcQ9J5bYTEyZ== {0}\n'.format(username) - ) + with salt.utils.fopen(authorized_keys_file, 'r') as fhr: + self.assertEqual( + fhr.read(), + 'ssh-rsa AAAAB3NzaC1kc3MAAACBAL0sQ9fJ5bYTEyY== root\n' + 'ssh-rsa AAAAB3NzaC1kcQ9J5bYTEyZ== {0}\n'.format(username) + ) @destructiveTest @skipIf(os.geteuid() != 0, 'you must be root to run this test') @@ -219,10 +220,11 @@ class SSHAuthStateTests(integration.ModuleCase, comment=username ) self.assertSaltTrueReturn(ret) - self.assertEqual( - open(authorized_keys_file, 'r').read(), - 'ssh-rsa AAAAB3NzaC1kcQ9J5bYTEyZ== {0}\n'.format(username) - ) + with salt.utils.fopen(authorized_keys_file, 'r') as fhr: + self.assertEqual( + fhr.read(), + 'ssh-rsa AAAAB3NzaC1kcQ9J5bYTEyZ== {0}\n'.format(username) + ) os.unlink(authorized_keys_file) @@ -236,10 +238,11 @@ class SSHAuthStateTests(integration.ModuleCase, saltenv='prod' ) self.assertSaltTrueReturn(ret) - self.assertEqual( - open(authorized_keys_file, 'r').read(), - 'ssh-rsa AAAAB3NzaC1kcQ9J5bYTEyZ== {0}\n'.format(username) - ) + with salt.utils.fopen(authorized_keys_file, 'r') as fhr: + self.assertEqual( + fhr.read(), + 'ssh-rsa AAAAB3NzaC1kcQ9J5bYTEyZ== {0}\n'.format(username) + ) if __name__ == '__main__': From 89befb8827022dd3d2fc6d6787e3405f0b9e58bc Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:02:24 +0000 Subject: [PATCH 017/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/states/virtualenv.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/integration/states/virtualenv.py b/tests/integration/states/virtualenv.py index e1cfac8773..1aa1287682 100644 --- a/tests/integration/states/virtualenv.py +++ b/tests/integration/states/virtualenv.py @@ -77,7 +77,8 @@ class VirtualenvTest(integration.ModuleCase, ] # Let's populate the requirements file, just pep-8 for now - open(requirements_file_path, 'a').write('pep8==1.3.3\n') + with salt.utils.fopen(requirements_file_path, 'a') as fhw: + fhw.write('pep8==1.3.3\n') # Let's run our state!!! try: @@ -104,7 +105,8 @@ class VirtualenvTest(integration.ModuleCase, self.assertNotIn('zope.interface==4.0.1', ret) # Now let's update the requirements file, which is now cached. - open(requirements_file_path, 'w').write('zope.interface==4.0.1\n') + with salt.utils.fopen(requirements_file_path, 'w') as fhw: + fhw.write('zope.interface==4.0.1\n') # Let's run our state!!! try: From c4d0686024a8e0c2070265d7962acb0dd6f8ff69 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:24:08 +0000 Subject: [PATCH 018/115] Switch `open()` for `salt.utils.fopen()` --- tests/unit/files_test.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/unit/files_test.py b/tests/unit/files_test.py index 1214f3f97b..8db494eee0 100644 --- a/tests/unit/files_test.py +++ b/tests/unit/files_test.py @@ -7,7 +7,8 @@ import copy import os import shutil import tempfile -from salt.utils import files +import salt.utils +from salt.utils import files as util_files from salttesting import TestCase from salttesting.helpers import ensure_in_syspath ensure_in_syspath('../../') @@ -30,7 +31,7 @@ class FilesTestCase(TestCase): os.makedirs(current_directory) for name, content in files.items(): path = os.path.join(temp_directory, folder, name) - with open(path, 'w+') as fh: + with salt.utils.fopen(path, 'w+') as fh: fh.write(content) def _validate_folder_structure_and_contents(self, target_directory, @@ -38,7 +39,7 @@ class FilesTestCase(TestCase): for folder, files in desired_structure.items(): for name, content in files.items(): path = os.path.join(target_directory, folder, name) - with open(path) as fh: + with salt.utils.fopen(path) as fh: assert fh.read().strip() == content def setUp(self): @@ -63,7 +64,7 @@ class FilesTestCase(TestCase): } self._create_temp_structure(test_target_directory, TARGET_STRUCTURE) try: - files.recursive_copy(self.temp_dir, test_target_directory) + util_files.recursive_copy(self.temp_dir, test_target_directory) DESIRED_STRUCTURE = copy.copy(TARGET_STRUCTURE) DESIRED_STRUCTURE.update(self.STRUCTURE) self._validate_folder_structure_and_contents( From 91af5500620dbb9aab2bfdd2bb2c6bc42a15b8e7 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:25:20 +0000 Subject: [PATCH 019/115] Switch `open()` for `salt.utils.fopen()` --- tests/unit/modules/file_test.py | 39 +++++++++++++++++---------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/tests/unit/modules/file_test.py b/tests/unit/modules/file_test.py index 08502cbe85..11fbc6c050 100644 --- a/tests/unit/modules/file_test.py +++ b/tests/unit/modules/file_test.py @@ -13,6 +13,7 @@ from salttesting.mock import MagicMock ensure_in_syspath('../../') # Import Salt libs +import salt.utils from salt.modules import file as filemod from salt.modules import config as configmod from salt.modules import cmdmod @@ -61,7 +62,7 @@ class FileReplaceTestCase(TestCase): def test_replace(self): filemod.replace(self.tfile.name, r'Etiam', 'Salticus', backup=False) - with open(self.tfile.name, 'rb') as fp: + with salt.utils.fopen(self.tfile.name, 'rb') as fp: self.assertIn('Salticus', fp.read()) def test_replace_append_if_not_found(self): @@ -80,19 +81,19 @@ class FileReplaceTestCase(TestCase): tfile.write(base + '\n') tfile.flush() filemod.replace(tfile.name, **args) - with open(tfile.name) as tfile2: + with salt.utils.fopen(tfile.name) as tfile2: self.assertEqual(tfile2.read(), expected) # File not ending with a newline, no match with tempfile.NamedTemporaryFile() as tfile: tfile.write(base) tfile.flush() filemod.replace(tfile.name, **args) - with open(tfile.name) as tfile2: + with salt.utils.fopen(tfile.name) as tfile2: self.assertEqual(tfile2.read(), expected) # A newline should not be added in empty files with tempfile.NamedTemporaryFile() as tfile: filemod.replace(tfile.name, **args) - with open(tfile.name) as tfile2: + with salt.utils.fopen(tfile.name) as tfile2: self.assertEqual(tfile2.read(), args['repl'] + '\n') # Using not_found_content, rather than repl with tempfile.NamedTemporaryFile() as tfile: @@ -101,7 +102,7 @@ class FileReplaceTestCase(TestCase): tfile.write(base) tfile.flush() filemod.replace(tfile.name, **args) - with open(tfile.name) as tfile2: + with salt.utils.fopen(tfile.name) as tfile2: self.assertEqual(tfile2.read(), expected) # not appending if matches with tempfile.NamedTemporaryFile() as tfile: @@ -110,7 +111,7 @@ class FileReplaceTestCase(TestCase): tfile.write(base) tfile.flush() filemod.replace(tfile.name, **args) - with open(tfile.name) as tfile2: + with salt.utils.fopen(tfile.name) as tfile2: self.assertEqual(tfile2.read(), expected) def test_backup(self): @@ -222,7 +223,7 @@ class FileBlockReplaceTestCase(TestCase): new_multiline_content, backup=False) - with open(self.tfile.name, 'rb') as fp: + with salt.utils.fopen(self.tfile.name, 'rb') as fp: filecontent = fp.read() self.assertIn('#-- START BLOCK 1' + "\n" + new_multiline_content @@ -244,7 +245,7 @@ class FileBlockReplaceTestCase(TestCase): append_if_not_found=False, backup=False ) - with open(self.tfile.name, 'rb') as fp: + with salt.utils.fopen(self.tfile.name, 'rb') as fp: self.assertNotIn('#-- START BLOCK 2' + "\n" + new_content + "\n" + '#-- END BLOCK 2', fp.read()) @@ -256,7 +257,7 @@ class FileBlockReplaceTestCase(TestCase): backup=False, append_if_not_found=True) - with open(self.tfile.name, 'rb') as fp: + with salt.utils.fopen(self.tfile.name, 'rb') as fp: self.assertIn('#-- START BLOCK 2' + "\n" + new_content + "\n" + '#-- END BLOCK 2', fp.read()) @@ -280,19 +281,19 @@ class FileBlockReplaceTestCase(TestCase): tfile.write(base + '\n') tfile.flush() filemod.blockreplace(tfile.name, **args) - with open(tfile.name) as tfile2: + with salt.utils.fopen(tfile.name) as tfile2: self.assertEqual(tfile2.read(), expected) # File not ending with a newline with tempfile.NamedTemporaryFile() as tfile: tfile.write(base) tfile.flush() filemod.blockreplace(tfile.name, **args) - with open(tfile.name) as tfile2: + with salt.utils.fopen(tfile.name) as tfile2: self.assertEqual(tfile2.read(), expected) # A newline should not be added in empty files with tempfile.NamedTemporaryFile() as tfile: filemod.blockreplace(tfile.name, **args) - with open(tfile.name) as tfile2: + with salt.utils.fopen(tfile.name) as tfile2: self.assertEqual(tfile2.read(), block) def test_replace_prepend(self): @@ -308,7 +309,7 @@ class FileBlockReplaceTestCase(TestCase): prepend_if_not_found=False, backup=False ) - with open(self.tfile.name, 'rb') as fp: + with salt.utils.fopen(self.tfile.name, 'rb') as fp: self.assertNotIn( '#-- START BLOCK 2' + "\n" + new_content + "\n" + '#-- END BLOCK 2', @@ -320,7 +321,7 @@ class FileBlockReplaceTestCase(TestCase): backup=False, prepend_if_not_found=True) - with open(self.tfile.name, 'rb') as fp: + with salt.utils.fopen(self.tfile.name, 'rb') as fp: self.assertTrue( fp.read().startswith( '#-- START BLOCK 2' @@ -334,7 +335,7 @@ class FileBlockReplaceTestCase(TestCase): 'new content 1', backup=False) - with open(self.tfile.name, 'rb') as fp: + with salt.utils.fopen(self.tfile.name, 'rb') as fp: filecontent = fp.read() self.assertIn('new content 1', filecontent) self.assertNotIn('to be removed', filecontent) @@ -435,7 +436,7 @@ class FileModuleTestCase(TestCase): filemod.sed(path, before, after, limit=limit) - with open(path, 'rb') as newfile: + with salt.utils.fopen(path, 'rb') as newfile: self.assertEqual( SED_CONTENT.replace(before, ''), newfile.read() @@ -451,19 +452,19 @@ class FileModuleTestCase(TestCase): tfile.write('foo\n') tfile.flush() filemod.append(tfile.name, 'bar') - with open(tfile.name) as tfile2: + with salt.utils.fopen(tfile.name) as tfile2: self.assertEqual(tfile2.read(), 'foo\nbar\n') # File not ending with a newline with tempfile.NamedTemporaryFile() as tfile: tfile.write('foo') tfile.flush() filemod.append(tfile.name, 'bar') - with open(tfile.name) as tfile2: + with salt.utils.fopen(tfile.name) as tfile2: self.assertEqual(tfile2.read(), 'foo\nbar\n') # A newline should not be added in empty files with tempfile.NamedTemporaryFile() as tfile: filemod.append(tfile.name, 'bar') - with open(tfile.name) as tfile2: + with salt.utils.fopen(tfile.name) as tfile2: self.assertEqual(tfile2.read(), 'bar\n') def test_extract_hash(self): From 53f554468debdb721998ee0d4b3f0735c77de97b Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:28:15 +0000 Subject: [PATCH 020/115] Switch `open()` for `salt.utils.fopen()` --- tests/unit/modules/ini_manage_test.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/unit/modules/ini_manage_test.py b/tests/unit/modules/ini_manage_test.py index 6578a64b8c..8ad7cfaf8b 100644 --- a/tests/unit/modules/ini_manage_test.py +++ b/tests/unit/modules/ini_manage_test.py @@ -2,7 +2,12 @@ import os import tempfile -from salttesting import TestCase +from salttesting.unit import TestCase +from salttesting.helpers import ensure_in_syspath + +ensure_in_syspath('../../') + +import salt.utils from salt.modules import ini_manage as ini @@ -112,7 +117,7 @@ empty_option= ini.set_option(self.tfile.name, { 'SectionB': {'test3': 'new value 3B'}, }) - with open(self.tfile.name, 'rb') as fp: + with salt.utils.fopen(self.tfile.name, 'rb') as fp: file_content = fp.read() self.assertIn('\nempty_option=\n', file_content, 'empty_option was not preserved') @@ -121,7 +126,7 @@ empty_option= ini.set_option(self.tfile.name, { 'SectionB': {'test3': 'new value 3B'}, }) - with open(self.tfile.name, 'rb') as fp: + with salt.utils.fopen(self.tfile.name, 'rb') as fp: file_content = fp.read() self.assertEqual('''\ # Comment on the first line From 737bd8440200d8a18ab1c20034363afdfaacacd9 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:28:56 +0000 Subject: [PATCH 021/115] Switch `open()` for `salt.utils.fopen()` --- tests/unit/pydsl_test.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/unit/pydsl_test.py b/tests/unit/pydsl_test.py index 59442bd8d1..57ba81ef5e 100644 --- a/tests/unit/pydsl_test.py +++ b/tests/unit/pydsl_test.py @@ -18,6 +18,7 @@ ensure_in_syspath('../') import integration import salt.loader import salt.config +import salt.utils from salt.state import HighState from salt.utils.pydsl import PyDslError @@ -291,7 +292,7 @@ class PyDSLRendererTestCase(TestCase): '''.format(output, output, output))) state_highstate({'base': ['aaa']}, dirpath) - with open(output, 'r') as f: + with salt.utils.fopen(output, 'r') as f: self.assertEqual(''.join(f.read().split()), "XYZABCDEF") finally: @@ -384,7 +385,7 @@ class PyDSLRendererTestCase(TestCase): hello blue 3 ''') - with open(output, 'r') as f: + with salt.utils.fopen(output, 'r') as f: self.assertEqual(sorted(f.read()), sorted(expected)) finally: @@ -417,10 +418,10 @@ class PyDSLRendererTestCase(TestCase): A() '''.format(dirpath, dirpath, dirpath, dirpath))) state_highstate({'base': ['aaa']}, dirpath) - with open(os.path.join(dirpath, 'yyy.txt'), 'r') as f: + with salt.utils.fopen(os.path.join(dirpath, 'yyy.txt'), 'r') as f: self.assertEqual(f.read(), 'hehe\nhoho\n') - with open(os.path.join(dirpath, 'xxx.txt'), 'r') as f: + with salt.utils.fopen(os.path.join(dirpath, 'xxx.txt'), 'r') as f: self.assertEqual(f.read(), 'hehe\n') finally: shutil.rmtree(dirpath, ignore_errors=True) @@ -493,7 +494,7 @@ class PyDSLRendererTestCase(TestCase): def write_to(fpath, content): - with open(fpath, 'w') as f: + with salt.utils.fopen(fpath, 'w') as f: f.write(content) From 9f609015978936aecbc60b40be9856f03a28c561 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:29:21 +0000 Subject: [PATCH 022/115] Switch `open()` for `salt.utils.fopen()` --- tests/unit/pyobjects_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/pyobjects_test.py b/tests/unit/pyobjects_test.py index 1b9c9d487a..5d0017c637 100644 --- a/tests/unit/pyobjects_test.py +++ b/tests/unit/pyobjects_test.py @@ -11,6 +11,7 @@ from salttesting.helpers import ensure_in_syspath ensure_in_syspath('../') import salt.state +import salt.utils from salt.config import minion_config from salt.template import compile_template from salt.utils.odict import OrderedDict @@ -209,7 +210,7 @@ class RendererMixin(object): def write_template_file(self, filename, content): full_path = os.path.join(self.root_dir, filename) - with open(full_path, 'w') as f: + with salt.utils.fopen(full_path, 'w') as f: f.write(content) return full_path From 2d210b9055a0e3f7ee979a4a6e67f8fabe0f6f7e Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:33:22 +0000 Subject: [PATCH 023/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/matcher.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/integration/shell/matcher.py b/tests/integration/shell/matcher.py index b7537f5e0b..938dd950ed 100644 --- a/tests/integration/shell/matcher.py +++ b/tests/integration/shell/matcher.py @@ -12,6 +12,7 @@ ensure_in_syspath('../../') # Import salt libs import integration +import salt.utils class MatchTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): @@ -248,13 +249,15 @@ class MatchTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): os.chdir(config_dir) config_file_name = 'master' - config = yaml.load( - open(self.get_config_file_path(config_file_name), 'r').read() - ) - config['log_file'] = 'file:///dev/log/LOG_LOCAL3' - open(os.path.join(config_dir, config_file_name), 'w').write( - yaml.dump(config, default_flow_style=False) - ) + with salt.utils.fopen(self.get_config_file_path(config_file_name), 'r') as fhr: + config = yaml.load( + fhr.read() + ) + config['log_file'] = 'file:///dev/log/LOG_LOCAL3' + with salt.utils.fopen(os.path.join(config_dir, config_file_name), 'w') as fhw: + fhw.write( + yaml.dump(config, default_flow_style=False) + ) ret = self.run_script( self._call_binary_, '--config-dir {0} minion test.ping'.format( From 2a58c2fe18a752c8790b1e2b3c7df6218258f7d5 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:34:49 +0000 Subject: [PATCH 024/115] Switch `open()` for `salt.utils.fopen()` --- salt/auth/pki.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/salt/auth/pki.py b/salt/auth/pki.py index a1d72af99e..980a6115a3 100644 --- a/salt/auth/pki.py +++ b/salt/auth/pki.py @@ -27,6 +27,9 @@ except ImportError: # Import python libs import logging +# Import salt libs +import salt.utils + log = logging.getLogger(__name__) @@ -60,7 +63,7 @@ def auth(pem, **kwargs): cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, pem) cacert_file = __salt__['config.get']('external_auth:pki:ca_file') - with open(cacert_file) as f: + with salt.utils.fopen(cacert_file) as f: cacert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, f.read()) log.debug('Attempting to authenticate via pki.') From 5f51444d66f58c4667458161c346d29b03cd9f47 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:35:22 +0000 Subject: [PATCH 025/115] Switch `open()` for `salt.utils.fopen()` --- salt/client/ssh/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/salt/client/ssh/__init__.py b/salt/client/ssh/__init__.py index f51f375068..fa9bb2ddfb 100644 --- a/salt/client/ssh/__init__.py +++ b/salt/client/ssh/__init__.py @@ -138,7 +138,7 @@ if not is_windows(): if not os.path.exists(shim_file): # On esky builds we only have the .pyc file shim_file += "c" - with open(shim_file) as ssh_py_shim: + with salt.utils.fopen(shim_file) as ssh_py_shim: SSH_PY_SHIM = ssh_py_shim.read() log = logging.getLogger(__name__) @@ -230,7 +230,7 @@ class SSH(object): ) ) pub = '{0}.pub'.format(priv) - with open(pub, 'r') as fp_: + with salt.utils.fopen(pub, 'r') as fp_: return '{0} rsa root@master'.format(fp_.read().split()[1]) def key_deploy(self, host, ret): From 8771d1a922055560e1271af141a312a3bf924aaf Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:36:10 +0000 Subject: [PATCH 026/115] Switch `open()` for `salt.utils.fopen()` --- salt/client/ssh/state.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/salt/client/ssh/state.py b/salt/client/ssh/state.py index 1c28975ee4..7f86c7b299 100644 --- a/salt/client/ssh/state.py +++ b/salt/client/ssh/state.py @@ -134,10 +134,10 @@ def prep_trans_tar(file_client, chunks, file_refs, pillar=None): ['salt://_outputters'], ['salt://_utils'], ] - with open(lowfn, 'w+') as fp_: + with salt.utils.fopen(lowfn, 'w+') as fp_: fp_.write(json.dumps(chunks)) if pillar: - with open(pillarfn, 'w+') as fp_: + with salt.utils.fopen(pillarfn, 'w+') as fp_: fp_.write(json.dumps(pillar)) for saltenv in file_refs: file_refs[saltenv].extend(sync_refs) From 7870adf08c74ecb94835bcbba29016527c7a3371 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:36:35 +0000 Subject: [PATCH 027/115] Switch `open()` for `salt.utils.fopen()` --- salt/cloud/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/cloud/__init__.py b/salt/cloud/__init__.py index 35ab600b5c..513b23deed 100644 --- a/salt/cloud/__init__.py +++ b/salt/cloud/__init__.py @@ -1593,7 +1593,7 @@ class Map(Cloud): ) ) try: - with open(self.opts['map'], 'rb') as fp_: + with salt.utils.fopen(self.opts['map'], 'rb') as fp_: if MAKO_AVAILABLE: log.warn('DEPRECATED: Mako will no longer be the default ' 'renderer for Salt Cloud maps in the Lithium release') From 33066c56fd39bb140f6132aa04a58c22fbdc3594 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:42:35 +0000 Subject: [PATCH 028/115] Switch `open()` for `salt.utils.fopen()` --- salt/grains/core.py | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/salt/grains/core.py b/salt/grains/core.py index 3c8a3676e1..ac845522c5 100644 --- a/salt/grains/core.py +++ b/salt/grains/core.py @@ -531,14 +531,12 @@ def _virtual(osdata): if osdata['kernel'] in choices: if os.path.isfile('/proc/1/cgroup'): try: - if ':/lxc/' in salt.utils.fopen( - '/proc/1/cgroup', 'r' - ).read(): - grains['virtual_subtype'] = 'LXC' - if ':/docker/' in salt.utils.fopen( - '/proc/1/cgroup', 'r' - ).read(): - grains['virtual_subtype'] = 'Docker' + with salt.utils.fopen('/proc/1/cgroup', 'r') as fhr: + if ':/lxc/' in fhr.read(): + grains['virtual_subtype'] = 'LXC' + with salt.utils.fopen('/proc/1/cgroup', 'r') as fhr: + if ':/docker/' in fhr.read(): + grains['virtual_subtype'] = 'Docker' except IOError: pass if isdir('/proc/vz'): @@ -571,14 +569,13 @@ def _virtual(osdata): grains['virtual_subtype'] = 'Xen HVM DomU' elif os.path.isfile('/proc/xen/capabilities') and \ os.access('/proc/xen/capabilities', os.R_OK): - caps = salt.utils.fopen('/proc/xen/capabilities') - if 'control_d' not in caps.read(): - # Tested on CentOS 5.5 / 2.6.18-194.3.1.el5xen - grains['virtual_subtype'] = 'Xen PV DomU' - else: - # Shouldn't get to this, but just in case - grains['virtual_subtype'] = 'Xen Dom0' - caps.close() + with salt.utils.fopen('/proc/xen/capabilities') as fhr: + if 'control_d' not in fhr.read(): + # Tested on CentOS 5.5 / 2.6.18-194.3.1.el5xen + grains['virtual_subtype'] = 'Xen PV DomU' + else: + # Shouldn't get to this, but just in case + grains['virtual_subtype'] = 'Xen Dom0' # Tested on Fedora 10 / 2.6.27.30-170.2.82 with xen # Tested on Fedora 15 / 2.6.41.4-1 without running xen elif isdir('/sys/bus/xen'): @@ -592,9 +589,9 @@ def _virtual(osdata): if 'dom' in grains.get('virtual_subtype', '').lower(): grains['virtual'] = 'xen' if os.path.isfile('/proc/cpuinfo'): - if 'QEMU Virtual CPU' in \ - salt.utils.fopen('/proc/cpuinfo', 'r').read(): - grains['virtual'] = 'kvm' + with salt.utils.fopen('/proc/cpuinfo', 'r') as fhr: + if 'QEMU Virtual CPU' in fhr.read(): + grains['virtual'] = 'kvm' elif osdata['kernel'] == 'FreeBSD': kenv = salt.utils.which('kenv') if kenv: @@ -940,10 +937,10 @@ def os_data(): grains['lsb_distrib_id'] = value.strip() elif os.path.isfile('/etc/SuSE-release'): grains['lsb_distrib_id'] = 'SUSE' - rel = open('/etc/SuSE-release').read().split('\n')[1] - patch = open('/etc/SuSE-release').read().split('\n')[2] - rel = re.sub("[^0-9]", "", rel) - patch = re.sub("[^0-9]", "", patch) + with salt.utils.fopen('/etc/SuSE-release') as fhr: + rel = re.sub("[^0-9]", "", fhr.read().split('\n')[1]) + with salt.utils.fopen('/etc/SuSE-release') as fhr: + patch = re.sub("[^0-9]", "", fhr.read().split('\n')[2]) release = rel + " SP" + patch grains['lsb_distrib_release'] = release grains['lsb_distrib_codename'] = "n.a" From 24f9c8f8d947ae268b35157bc713b0f58854dc92 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:42:59 +0000 Subject: [PATCH 029/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/chef.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/chef.py b/salt/modules/chef.py index 998a290ba1..4923a4a469 100644 --- a/salt/modules/chef.py +++ b/salt/modules/chef.py @@ -181,7 +181,7 @@ def _exec_cmd(*args, **kwargs): result = __salt__['cmd.run_all']('script -q -c "{0}" {1}'.format(cmd_exec, filename)) # Read the output from the script command, stripping the first line - with open(filename, 'r') as outfile: + with salt.utils.fopen(filename, 'r') as outfile: stdout = outfile.readlines() result['stdout'] = ''.join(stdout[1:]) os.remove(filename) From 9c2bb1ce280b3d670e8eab1dd4c663f7687a4633 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:43:38 +0000 Subject: [PATCH 030/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/debian_ip.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/salt/modules/debian_ip.py b/salt/modules/debian_ip.py index b8f4461a97..4cd22ced52 100644 --- a/salt/modules/debian_ip.py +++ b/salt/modules/debian_ip.py @@ -257,7 +257,7 @@ def _parse_current_network_settings(): opts['networking'] = '' if os.path.isfile(_DEB_NETWORKING_FILE): - with open(_DEB_NETWORKING_FILE) as contents: + with salt.utils.fopen(_DEB_NETWORKING_FILE) as contents: for line in contents: if line.startswith('#'): continue @@ -528,7 +528,7 @@ def _parse_interfaces(interface_files=None): method = -1 for interface_file in interface_files: - with open(interface_file) as interfaces: + with salt.utils.fopen(interface_file) as interfaces: for line in interfaces: # Identify the clauses by the first word of each line. # Go to the next line if the current line is a comment @@ -1445,9 +1445,8 @@ def _write_file_ppp_ifaces(iface, data): msg = msg.format(os.path.dirname(filename)) log.error(msg) raise AttributeError(msg) - fout = salt.utils.fopen(filename, 'w') - fout.write(ifcfg) - fout.close() + with salt.utils.fopen(filename, 'w') as fout: + fout.write(ifcfg) # Return as a array so the difflib works return filename From 730fd6dfe919456cb7c1105ddd7bf51b000e4e49 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:45:15 +0000 Subject: [PATCH 031/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/dockerio.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/salt/modules/dockerio.py b/salt/modules/dockerio.py index dc6191e2e9..60f8c9e3b1 100644 --- a/salt/modules/dockerio.py +++ b/salt/modules/dockerio.py @@ -532,20 +532,17 @@ def export(container, path): ''' try: ppath = os.path.abspath(path) - fic = open(ppath, 'w') - status = base_status.copy() - client = _get_client() - response = client.export(_get_container_infos(container)['Id']) - try: + with salt.utils.fopen(ppath, 'w') as fic: + status = base_status.copy() + client = _get_client() + response = client.export(_get_container_infos(container)['Id']) byte = response.read(4096) fic.write(byte) while byte != '': # Do stuff with byte. byte = response.read(4096) fic.write(byte) - finally: fic.flush() - fic.close() _valid(status, id_=container, out=ppath, comment='Exported to {0}'.format(ppath)) @@ -1945,10 +1942,8 @@ def get_container_root(container): default_rootfs = os.path.join(default_path, 'roofs') rootfs_re = re.compile(r'^lxc.rootfs\s*=\s*(.*)\s*$', re.U) try: - lxcconfig = os.path.join( - default_path, 'config.lxc') - f = open(lxcconfig) - try: + lxcconfig = os.path.join(default_path, 'config.lxc') + with salt.utils.fopen(lxcconfig) as fhr: lines = f.readlines() rlines = lines[:] rlines.reverse() @@ -1957,8 +1952,6 @@ def get_container_root(container): if robj: rootfs = robj.groups()[0] break - finally: - f.close() except Exception: rootfs = default_rootfs return rootfs From dd92b094af074eadc219da521fda61f28a7751e0 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:49:13 +0000 Subject: [PATCH 032/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/file.py | 68 +++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/salt/modules/file.py b/salt/modules/file.py index 76dcc957b6..e8d637bb8e 100644 --- a/salt/modules/file.py +++ b/salt/modules/file.py @@ -844,16 +844,13 @@ def psed(path, shutil.copy2(path, '{0}{1}'.format(path, backup)) - try: - ofile = salt.utils.fopen(path, 'w') + with salt.utils.fopen(path, 'w') as ofile: with salt.utils.fopen('{0}{1}'.format(path, backup), 'r') as ifile: if multi is True: for line in ifile.readline(): ofile.write(_psed(line, before, after, limit, flags)) else: ofile.write(_psed(ifile.read(), before, after, limit, flags)) - finally: - ofile.close() RE_FLAG_TABLE = {'I': re.I, @@ -1678,7 +1675,8 @@ def prepend(path, *args, **kwargs): args = [kwargs['args']] try: - contents = salt.utils.fopen(path).readlines() + with salt.utils.fopen(path) as fhr: + contents = fhr.readlines() except IOError: contents = [] @@ -1763,7 +1761,8 @@ def touch(name, atime=None, mtime=None): mtime = int(mtime) try: if not os.path.exists(name): - salt.utils.fopen(name, 'a') + with salt.utils.fopen(name, 'a') as fhw: + fhw.write('') if not atime and not mtime: times = None @@ -1862,11 +1861,8 @@ def truncate(path, length): salt '*' file.truncate /path/to/file 512 ''' - try: - seek_fh = open(path, 'r+') + with salt.utils.fopen(path, 'r+') as seek_fh: seek_fh.truncate(int(length)) - finally: - seek_fh.close() def link(src, path): @@ -2590,34 +2586,34 @@ def extract_hash(hash_fn, hash_type='sha256', file_name=''): name_sought = re.findall(r'^(.+)/([^/]+)$', '/x' + file_name)[0][1] log.debug('modules.file.py - extract_hash(): Extracting hash for file ' 'named: {0}'.format(name_sought)) - hash_fn_fopen = salt.utils.fopen(hash_fn, 'r') - for hash_variant in HASHES: - if hash_type == '' or hash_type == hash_variant[0]: - log.debug('modules.file.py - extract_hash(): Will use regex to get' - ' a purely hexadecimal number of length ({0}), presumably hash' - ' type : {1}'.format(hash_variant[1], hash_variant[0])) - hash_fn_fopen.seek(0) - for line in hash_fn_fopen.read().splitlines(): - hash_array = re.findall(r'(?i)(? Date: Wed, 26 Nov 2014 18:49:43 +0000 Subject: [PATCH 033/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/ini_manage.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/salt/modules/ini_manage.py b/salt/modules/ini_manage.py index c7ff3d1c25..969d96f1cd 100644 --- a/salt/modules/ini_manage.py +++ b/salt/modules/ini_manage.py @@ -14,6 +14,9 @@ Use section as DEFAULT_IMPLICIT if your ini file does not have any section # Import Python libs import re +# Import Salt libs +import salt.utils + __virtualname__ = 'ini' @@ -277,7 +280,7 @@ class _Ini(object): self.sections = [] current_section = _Section('DEFAULT_IMPLICIT') self.sections.append(current_section) - with open(self.file_name, 'r') as inifile: + with salt.utils.fopen(self.file_name, 'r') as inifile: previous_line = None for line in inifile.readlines(): # Make sure the empty lines between options are preserved @@ -293,7 +296,7 @@ class _Ini(object): previous_line = line def flush(self): - with open(self.file_name, 'w') as outfile: + with salt.utils.fopen(self.file_name, 'w') as outfile: outfile.write(self.current_contents()) def dump(self): From 8b4539d9a146be5663b2364a00ce75a5821bf699 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:50:07 +0000 Subject: [PATCH 034/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/launchctl.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/salt/modules/launchctl.py b/salt/modules/launchctl.py index 6ccb70d6c9..9f51b4431b 100644 --- a/salt/modules/launchctl.py +++ b/salt/modules/launchctl.py @@ -10,6 +10,7 @@ import os import plistlib # Import salt libs +import salt.utils import salt.utils.decorators as decorators # Define the module's virtual name @@ -55,7 +56,7 @@ def _available_services(): try: # This assumes most of the plist files will be already in XML format - with open(file_path): + with salt.utils.fopen(file_path): plist = plistlib.readPlist(true_path) except Exception: From d447ceadef478f3e907650d01126614eb848d0f5 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:51:55 +0000 Subject: [PATCH 035/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/lxc.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/salt/modules/lxc.py b/salt/modules/lxc.py index 53cab5c2bc..a530817154 100644 --- a/salt/modules/lxc.py +++ b/salt/modules/lxc.py @@ -556,7 +556,7 @@ class _LXCConfig(object): if self.name: self.path = '/var/lib/lxc/{0}/config'.format(self.name) if os.path.isfile(self.path): - with open(self.path) as f: + with salt.utils.fopen(self.path) as f: for l in f.readlines(): match = self.pattern.findall((l.strip())) if match: @@ -603,7 +603,7 @@ class _LXCConfig(object): content = self.as_string() # 2 step rendering to be sure not to open/wipe the config # before as_string succeeds. - with open(self.path, 'w') as fic: + with salt.utils.fopen(self.path, 'w') as fic: fic.write(content) fic.flush() @@ -1673,9 +1673,10 @@ def info(name): ret = {} - config = [(v[0].strip(), v[1].strip()) for v in - [l.split('#', 1)[0].strip().split('=', 1) for l in - open(f).readlines()] if len(v) == 2] + with salt.utils.fopen(f) as fhr: + config = [(v[0].strip(), v[1].strip()) for v in + [l.split('#', 1)[0].strip().split('=', 1) for l in + fhr.readlines()] if len(v) == 2] ifaces = [] current = None @@ -1821,7 +1822,7 @@ def update_lxc_conf(name, lxc_conf, lxc_conf_unset): ret['comment'] = ( 'Configuration does not exist: {0}'.format(lxc_conf_p)) else: - with open(lxc_conf_p, 'r') as fic: + with salt.utils.fopen(lxc_conf_p, 'r') as fic: filtered_lxc_conf = [] for row in lxc_conf: if not row: @@ -1878,12 +1879,10 @@ def update_lxc_conf(name, lxc_conf, lxc_conf_unset): conf_changed = conf != orig_config chrono = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S') if conf_changed: - wfic = open('{0}.{1}'.format(lxc_conf_p, chrono), 'w') - wfic.write(conf) - wfic.close() - wfic = open(lxc_conf_p, 'w') - wfic.write(conf) - wfic.close() + with salt.utils.fopen('{0}.{1}'.format(lxc_conf_p, chrono), 'w') as wfic: + wfic.write(conf) + with salt.utils.fopen(lxc_conf_p, 'w') as wific: + wfic.write(conf) ret['comment'] = 'Updated' ret['result'] = True if ( From f7d9c81789b1b3f785fe700c5f31ec5f82d26a0a Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:52:54 +0000 Subject: [PATCH 036/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/openbsdservice.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/salt/modules/openbsdservice.py b/salt/modules/openbsdservice.py index 6c36b69273..d962702787 100644 --- a/salt/modules/openbsdservice.py +++ b/salt/modules/openbsdservice.py @@ -7,6 +7,9 @@ The service module for OpenBSD import os import logging +# Import Salt libs +import salt.utils + log = logging.getLogger(__name__) # XXX enable/disable support would be nice @@ -127,7 +130,7 @@ def _get_rc(): try: # now read the system startup script /etc/rc # to know what are the system enabled daemons - with open('/etc/rc', 'r') as handle: + with salt.utils.fopen('/etc/rc', 'r') as handle: lines = handle.readlines() except IOError: log.error('Unable to read /etc/rc') From 4db7003978907a997d544c7999794afcab02f4b4 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:53:20 +0000 Subject: [PATCH 037/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/seed.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/salt/modules/seed.py b/salt/modules/seed.py index a335850581..dd4557c598 100644 --- a/salt/modules/seed.py +++ b/salt/modules/seed.py @@ -28,7 +28,7 @@ __func_alias__ = { def _file_or_content(file_): if os.path.exists(file_): - with open(file_) as fic: + with salt.utils.fopen(file_) as fic: return fic.read() return file_ @@ -179,9 +179,9 @@ def mkconfig(config=None, tmp=None, id_=None, approve_key=True, privkeyfn = os.path.join(tmp, 'minion.pem') preseeded = pub_key and priv_key if preseeded: - with open(pubkeyfn, 'w') as fic: + with salt.utils.fopen(pubkeyfn, 'w') as fic: fic.write(_file_or_content(pub_key)) - with open(privkeyfn, 'w') as fic: + with salt.utils.fopen(privkeyfn, 'w') as fic: fic.write(_file_or_content(priv_key)) os.chmod(pubkeyfn, 0600) os.chmod(privkeyfn, 0600) From 0f53576aa9383be6bfa006c469ffd99a887b2c0d Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 18:53:55 +0000 Subject: [PATCH 038/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/softwareupdate.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/salt/modules/softwareupdate.py b/salt/modules/softwareupdate.py index 1e6070d78e..b995ceb398 100644 --- a/salt/modules/softwareupdate.py +++ b/salt/modules/softwareupdate.py @@ -342,8 +342,9 @@ def list_downloads(): ret = [] for update in _get_upgradable(): for f in dist_files: - if update.rsplit('-', 1)[0] in open(f).read(): - ret.append(update) + with salt.utils.fopen(f) as fhr: + if update.rsplit('-', 1)[0] in fhr.read(): + ret.append(update) return ret From 68e9b2189555c1efa76e471b004326d8f906d8e6 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:03:27 +0000 Subject: [PATCH 039/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/tls.py | 192 ++++++++++++++++++++------------------------ 1 file changed, 86 insertions(+), 106 deletions(-) diff --git a/salt/modules/tls.py b/salt/modules/tls.py index 5318c80252..512306c4fa 100644 --- a/salt/modules/tls.py +++ b/salt/modules/tls.py @@ -183,14 +183,14 @@ def maybe_fix_ssl_version(ca_name, cacert_path=None): ca_name) ca_keyp = '{0}/{1}/{2}_ca_cert.key'.format( cert_base_path(), ca_name, ca_name) - with open(certp) as fic: + with salt.utils.fopen(certp) as fic: cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, fic.read()) if cert.get_version() == 3: log.info( 'Regenerating wrong x509 version ' 'for certificate {0}'.format(certp)) - with open(ca_keyp) as fic2: + with salt.utils.fopen(ca_keyp) as fic2: try: # try to determine the key bits key = OpenSSL.crypto.load_privatekey( @@ -274,7 +274,7 @@ def get_ca(ca_name, as_text=False, cacert_path=None): raise ValueError('Certificate does not exists for {0}'.format(ca_name)) else: if as_text: - with open(certp) as fic: + with salt.utils.fopen(certp) as fic: certp = fic.read() return certp @@ -364,7 +364,7 @@ def create_ca(ca_name, # try to reuse existing ssl key key = None if os.path.exists(ca_keyp): - with open(ca_keyp) as fic2: + with salt.utils.fopen(ca_keyp) as fic2: # try to determine the key bits key = OpenSSL.crypto.load_privatekey( OpenSSL.crypto.FILETYPE_PEM, fic2.read()) @@ -412,24 +412,22 @@ def create_ca(ca_name, if os.path.exists(ca_keyp): bck = "{0}.{1}".format(ca_keyp, datetime.datetime.now().strftime( "%Y%m%d%H%M%S")) - with open(ca_keyp) as fic: + with salt.utils.fopen(ca_keyp) as fic: old_key = fic.read().strip() if old_key.strip() == keycontent.strip(): write_key = False else: log.info('Saving old CA ssl key in {0}'.format(bck)) - with open(bck, 'w') as bckf: + with salt.utils.fopen(bck, 'w') as bckf: bckf.write(old_key) os.chmod(bck, 0600) if write_key: - ca_key = salt.utils.fopen(ca_keyp, 'w') - ca_key.write(keycontent) - ca_key.close() + with salt.utils.fopen(ca_keyp, 'w') as ca_key: + ca_key.write(keycontent) - ca_crt = salt.utils.fopen(certp, 'w') - ca_crt.write( - OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, ca)) - ca_crt.close() + with salt.utils.fopen(certp, 'w') as ca_crt: + ca_crt.write( + OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, ca)) _write_cert_to_database(ca_name, ca) @@ -547,24 +545,20 @@ def create_csr(ca_name, req.sign(key, digest) # Write private key and request - priv_key = salt.utils.fopen( - '{0}/{1}/certs/{2}.key'.format(cert_base_path(), - ca_name, CN), - 'w+' - ) - priv_key.write( - OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, key) - ) - priv_key.close() - - csr = salt.utils.fopen(csr_f, 'w+') - csr.write( - OpenSSL.crypto.dump_certificate_request( - OpenSSL.crypto.FILETYPE_PEM, - req + with salt.utils.fopen('{0}/{1}/certs/{2}.key'.format( + cert_base_path(), + ca_name, CN), 'w+') as priv_key: + priv_key.write( + OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, key) + ) + + with salt.utils.fopen(csr_f, 'w+') as csr: + csr.write( + OpenSSL.crypto.dump_certificate_request( + OpenSSL.crypto.FILETYPE_PEM, + req + ) ) - ) - csr.close() ret = 'Created Private Key: "{0}/{1}/certs/{2}.key." '.format( cert_base_path(), @@ -686,28 +680,25 @@ def create_self_signed_cert(tls_dir='tls', cert.sign(key, digest) # Write private key and cert - priv_key = salt.utils.fopen( - '{0}/{1}/certs/{2}.key'.format(cert_base_path(), - tls_dir, CN), - 'w+' - ) - priv_key.write( - OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, key) - ) - priv_key.close() - - crt = salt.utils.fopen('{0}/{1}/certs/{2}.crt'.format( - cert_base_path(), - tls_dir, - CN - ), 'w+') - crt.write( - OpenSSL.crypto.dump_certificate( - OpenSSL.crypto.FILETYPE_PEM, - cert + with salt.utils.fopen( + '{0}/{1}/certs/{2}.key'.format(cert_base_path(), + tls_dir, CN), + 'w+' + ) as priv_key: + priv_key.write( + OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, key) + ) + + with salt.utils.fopen('{0}/{1}/certs/{2}.crt'.format(cert_base_path(), + tls_dir, + CN + ), 'w+') as crt: + crt.write( + OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_PEM, + cert + ) ) - ) - crt.close() _write_cert_to_database(tls_dir, cert) @@ -783,33 +774,30 @@ def create_ca_signed_cert(ca_name, CN, days=365, cacert_path=None, digest='sha25 try: maybe_fix_ssl_version(ca_name) - ca_cert = OpenSSL.crypto.load_certificate( - OpenSSL.crypto.FILETYPE_PEM, - salt.utils.fopen('{0}/{1}/{2}_ca_cert.crt'.format( - cert_base_path(), - ca_name, ca_name - )).read() + with salt.utils.fopen('{0}/{1}/{2}_ca_cert.crt'.format(cert_base_path(), + ca_name, + ca_name)) as fhr: + ca_cert = OpenSSL.crypto.load_certificate( + OpenSSL.crypto.FILETYPE_PEM, fhr.read() ) - ca_key = OpenSSL.crypto.load_privatekey( - OpenSSL.crypto.FILETYPE_PEM, - salt.utils.fopen('{0}/{1}/{2}_ca_cert.key'.format( - cert_base_path(), - ca_name, - ca_name - )).read() + with salt.utils.fopen('{0}/{1}/{2}_ca_cert.key'.format(cert_base_path(), + ca_name, + ca_name)) as fhr: + ca_key = OpenSSL.crypto.load_privatekey( + OpenSSL.crypto.FILETYPE_PEM, + fhr.read() ) except IOError: return 'There is no CA named "{0}"'.format(ca_name) try: - req = OpenSSL.crypto.load_certificate_request( - OpenSSL.crypto.FILETYPE_PEM, - salt.utils.fopen('{0}/{1}/certs/{2}.csr'.format( - cert_base_path(), - ca_name, - CN - )).read() - ) + with salt.utils.fopen('{0}/{1}/certs/{2}.csr'.format(cert_base_path(), + ca_name, + CN)) as fhr: + req = OpenSSL.crypto.load_certificate_request( + OpenSSL.crypto.FILETYPE_PEM, + fhr.read() + ) except IOError: return 'There is no CSR that matches the CN "{0}"'.format(CN) @@ -839,18 +827,15 @@ def create_ca_signed_cert(ca_name, CN, days=365, cacert_path=None, digest='sha25 cert.set_pubkey(req.get_pubkey()) cert.sign(ca_key, digest) - crt = salt.utils.fopen('{0}/{1}/certs/{2}.crt'.format( - cert_base_path(), - ca_name, - CN - ), 'w+') - crt.write( + with salt.utils.fopen('{0}/{1}/certs/{2}.crt'.format(cert_base_path(), + ca_name, + CN), 'w+') as crt: + crt.write( OpenSSL.crypto.dump_certificate( OpenSSL.crypto.FILETYPE_PEM, cert ) ) - crt.close() _write_cert_to_database(ca_name, cert) @@ -903,34 +888,31 @@ def create_pkcs12(ca_name, CN, passphrase='', cacert_path=None): return 'Certificate "{0}" already exists'.format(CN) try: - ca_cert = OpenSSL.crypto.load_certificate( - OpenSSL.crypto.FILETYPE_PEM, - salt.utils.fopen('{0}/{1}/{2}_ca_cert.crt'.format( - cert_base_path(), - ca_name, - ca_name - )).read() + with salt.utils.fopen('{0}/{1}/{2}_ca_cert.crt'.format(cert_base_path(), + ca_name, + ca_name)) as fhr: + ca_cert = OpenSSL.crypto.load_certificate( + OpenSSL.crypto.FILETYPE_PEM, + fhr.read() ) except IOError: return 'There is no CA named "{0}"'.format(ca_name) try: - cert = OpenSSL.crypto.load_certificate( - OpenSSL.crypto.FILETYPE_PEM, - salt.utils.fopen('{0}/{1}/certs/{2}.crt'.format( - cert_base_path(), - ca_name, - CN - )).read() - ) - key = OpenSSL.crypto.load_privatekey( - OpenSSL.crypto.FILETYPE_PEM, - salt.utils.fopen('{0}/{1}/certs/{2}.key'.format( - cert_base_path(), - ca_name, - CN - )).read() + with salt.utils.fopen('{0}/{1}/certs/{2}.crt'.format(cert_base_path(), + ca_name, + CN)) as fhr: + cert = OpenSSL.crypto.load_certificate( + OpenSSL.crypto.FILETYPE_PEM, + fhr.read() ) + with salt.utils.fopen('{0}/{1}/certs/{2}.key'.format(cert_base_path(), + ca_name, + CN)) as fhr: + key = OpenSSL.crypto.load_privatekey( + OpenSSL.crypto.FILETYPE_PEM, + fhr.read() + ) except IOError: return 'There is no certificate that matches the CN "{0}"'.format(CN) @@ -940,11 +922,9 @@ def create_pkcs12(ca_name, CN, passphrase='', cacert_path=None): pkcs12.set_ca_certificates([ca_cert]) pkcs12.set_privatekey(key) - with salt.utils.fopen('{0}/{1}/certs/{2}.p12'.format( - cert_base_path(), - ca_name, - CN - ), 'w') as ofile: + with salt.utils.fopen('{0}/{1}/certs/{2}.p12'.format(cert_base_path(), + ca_name, + CN), 'w') as ofile: ofile.write(pkcs12.export(passphrase=passphrase)) return ('Created PKCS#12 Certificate for "{0}": ' From 1d5e2833fe4251967fe4ee73b14fdfc49f3bfb2e Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:09:00 +0000 Subject: [PATCH 040/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/zcbuildout.py | 70 +++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/salt/modules/zcbuildout.py b/salt/modules/zcbuildout.py index 37443c5bbd..a28537f8a7 100644 --- a/salt/modules/zcbuildout.py +++ b/salt/modules/zcbuildout.py @@ -28,14 +28,6 @@ You have those following methods: __virtualname__ = 'buildout' -def __virtual__(): - ''' - Only load if buildout libs are present - ''' - if True: - return __virtualname__ - return False - # Import python libs import os import re @@ -46,6 +38,7 @@ import copy import urllib2 # Import salt libs +import salt.utils from salt.exceptions import CommandExecutionError from salt._compat import string_types @@ -72,6 +65,13 @@ DEFAULT_VER = 2 _logger = logging.getLogger(__name__) +def __virtual__(): + ''' + Only load if buildout libs are present + ''' + return __virtualname__ + + def _salt_callback(func, **kwargs): LOG.clear() @@ -386,11 +386,10 @@ def _get_bootstrap_content(directory='.'): Get the current bootstrap.py script content ''' try: - fic = open( - os.path.join( - os.path.abspath(directory), 'bootstrap.py')) - oldcontent = fic.read() - fic.close() + with salt.utils.fopen(os.path.join( + os.path.abspath(directory), + 'bootstrap.py')) as fic: + oldcontent = fic.read() except (OSError, IOError): oldcontent = '' return oldcontent @@ -412,16 +411,15 @@ def _get_buildout_ver(directory='.'): try: files = _find_cfgs(directory) for f in files: - fic = open(f) - buildout1re = re.compile(r'^zc\.buildout\s*=\s*1', RE_F) - dfic = fic.read() - if ( - ('buildout.dumppick' in dfic) - or - (buildout1re.search(dfic)) - ): - buildoutver = 1 - fic.close() + with salt.utils.fopen(f) as fic: + buildout1re = re.compile(r'^zc\.buildout\s*=\s*1', RE_F) + dfic = fic.read() + if ( + ('buildout.dumppick' in dfic) + or + (buildout1re.search(dfic)) + ): + buildoutver = 1 bcontent = _get_bootstrap_content(directory) if ( '--download-base' in bcontent @@ -515,7 +513,7 @@ def upgrade_bootstrap(directory='.', if not os.path.isdir(dbuild): os.makedirs(dbuild) # only try to download once per buildout checkout - open(os.path.join( + salt.utils.fopen(os.path.join( dbuild, '{0}.updated_bootstrap'.format(buildout_ver))) except (OSError, IOError): @@ -530,20 +528,17 @@ def upgrade_bootstrap(directory='.', data = '\n'.join(ldata) if updated: comment = 'Bootstrap updated' - fic = open(b_py, 'w') - fic.write(data) - fic.close() + with salt.utils.fopen(b_py, 'w') as fic: + fic.write(data) if dled: - afic = open(os.path.join( - dbuild, '{0}.updated_bootstrap'.format(buildout_ver) - ), 'w') - afic.write('foo') - afic.close() + with salt.utils.fopen(os.path.join(dbuild, + '{0}.updated_bootstrap'.format( + buildout_ver)), 'w') as afic: + afic.write('foo') except (OSError, IOError): if oldcontent: - fic = open(b_py, 'w') - fic.write(oldcontent) - fic.close() + with salt.utils.fopen(b_py, 'w') as fic: + fic.write(oldcontent) return {'comment': comment} @@ -733,9 +728,8 @@ def bootstrap(directory='.', buildout_ver=buildout_ver) # be sure which buildout bootstrap we have b_py = os.path.join(directory, 'bootstrap.py') - fic = open(b_py) - content = fic.read() - fic.close() + with salt.utils.fopen(b_py) as fic: + content = fic.read() if ( (False != test_release) and ' --accept-buildout-test-releases' in content From 6ba41c9181dd210e75eb70723ce1e550fdfe41c8 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:13:11 +0000 Subject: [PATCH 041/115] Switch `open()` for `salt.utils.fopen()` --- salt/renderers/pyobjects.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/salt/renderers/pyobjects.py b/salt/renderers/pyobjects.py index 086811b7dd..25555640a7 100644 --- a/salt/renderers/pyobjects.py +++ b/salt/renderers/pyobjects.py @@ -263,6 +263,7 @@ import logging import re import sys +import salt.utils from salt.loader import _create_loader from salt.fileclient import get_file_client from salt.utils.pyobjects import Registry, StateFactory, SaltObject, Map @@ -406,7 +407,7 @@ def render(template, saltenv='base', sls='', salt_data=True, **kwargs): if not state_file: raise ImportError("Could not find the file {0!r}".format(import_file)) - with open(state_file) as f: + with salt.utils.fopen(state_file) as f: state_contents = f.read() state_locals = {} From 405e5647850fe2280c6c218a50c912397fea34b2 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:16:08 +0000 Subject: [PATCH 042/115] Switch `open()` for `salt.utils.fopen()` --- salt/runners/lxc.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/salt/runners/lxc.py b/salt/runners/lxc.py index a9592bb95d..1538e0aa92 100644 --- a/salt/runners/lxc.py +++ b/salt/runners/lxc.py @@ -13,12 +13,13 @@ import copy import logging # Import Salt libs -from salt.utils.odict import OrderedDict as _OrderedDict import salt.client import salt.output +import salt.utils import salt.utils.virt import salt.utils.cloud import salt.key +from salt.utils.odict import OrderedDict as _OrderedDict log = logging.getLogger(__name__) @@ -302,10 +303,10 @@ def init(names, host=None, saltcloud_mode=False, quiet=False, **kwargs): if explicit_auth: fcontent = '' if os.path.exists(key): - with open(key) as fic: + with salt.utils.fopen(key) as fic: fcontent = fic.read().strip() if pub_key.strip() != fcontent: - with open(key, 'w') as fic: + with salt.utils.fopen(key, 'w') as fic: fic.write(pub_key) fic.flush() mid = j_ret.get('mid', None) From b2e0c9905da880cc110742e5d74ec84bc186c3a3 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:16:58 +0000 Subject: [PATCH 043/115] Switch `open()` for `salt.utils.fopen()` --- salt/runners/manage.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/salt/runners/manage.py b/salt/runners/manage.py index 3ec9919bb8..06c5e2a8d4 100644 --- a/salt/runners/manage.py +++ b/salt/runners/manage.py @@ -18,6 +18,7 @@ import urllib import salt.key import salt.client import salt.output +import salt.utils import salt.utils.minions import salt.wheel import salt.version @@ -419,9 +420,8 @@ objShell.Exec("{1}{2}")''' ' >>' + x + '.vbs\ncscript.exe /NoLogo ' + x + '.vbs' batch_path = tempfile.mkstemp(suffix='.bat')[1] - batch_file = open(batch_path, 'wb') - batch_file.write(batch) - batch_file.close() + with salt.utils.fopen(batch_path, 'wb') as batch_file: + batch_file.write(batch) for host in hosts.split(","): argv = ['psexec', '\\\\' + host] From d523a089af9cbe12714550f7d6ec32852cfa4d42 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:17:33 +0000 Subject: [PATCH 044/115] Switch `open()` for `salt.utils.fopen()` --- salt/states/apache.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/salt/states/apache.py b/salt/states/apache.py index 3607903f74..0f6b3ed472 100644 --- a/salt/states/apache.py +++ b/salt/states/apache.py @@ -43,6 +43,9 @@ from __future__ import with_statement, print_function # Import python libs import os.path +# Import Salt libs +import salt.utils + def __virtual__(): return 'apache.config' in __salt__ @@ -57,7 +60,7 @@ def configfile(name, config): configs = __salt__['apache.config'](name, config, edit=False) current_configs = '' if os.path.exists(name): - with open(name) as config_file: + with salt.utils.fopen(name) as config_file: current_configs = config_file.read() if configs == current_configs.strip(): @@ -74,7 +77,7 @@ def configfile(name, config): return ret try: - with open(name, 'w') as config_file: + with salt.utils.fopen(name, 'w') as config_file: print(configs, file=config_file) ret['changes'] = { 'old': current_configs, From 6aa234008b06be3451ea902df1c8890fe13bf462 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:18:30 +0000 Subject: [PATCH 045/115] Switch `open()` for `salt.utils.fopen()` --- salt/states/augeas.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/salt/states/augeas.py b/salt/states/augeas.py index 94ce2e5454..47eb386ee2 100644 --- a/salt/states/augeas.py +++ b/salt/states/augeas.py @@ -34,6 +34,9 @@ import re import os.path import difflib +# Import Salt libs +import salt.utils + def __virtual__(): return 'augeas' if 'augeas.execute' in __salt__ else False @@ -175,9 +178,8 @@ def change(name, context=None, changes=None, lens=None, **kwargs): if context: filename = re.sub('^/files|/$', '', context) if os.path.isfile(filename): - file_ = open(filename, 'r') - old_file = file_.readlines() - file_.close() + with salt.utils.fopen(filename, 'r') as file_: + old_file = file_.readlines() result = __salt__['augeas.execute'](context=context, lens=lens, commands=changes) ret['result'] = result['retval'] @@ -187,9 +189,8 @@ def change(name, context=None, changes=None, lens=None, **kwargs): return ret if old_file: - file_ = open(filename, 'r') - diff = ''.join(difflib.unified_diff(old_file, file_.readlines(), n=0)) - file_.close() + with salt.utils.fopen(filename, 'r') as file_: + diff = ''.join(difflib.unified_diff(old_file, file_.readlines(), n=0)) if diff: ret['comment'] = 'Changes have been saved' From fad1b1c67f24a59aa63d39331d267e854bc32040 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:19:04 +0000 Subject: [PATCH 046/115] Switch `open()` for `salt.utils.fopen()` --- salt/states/mysql_query.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/salt/states/mysql_query.py b/salt/states/mysql_query.py index 6035e66742..6aa3cd5bdb 100644 --- a/salt/states/mysql_query.py +++ b/salt/states/mysql_query.py @@ -20,9 +20,13 @@ Its output may be stored in a file or in a grain. - output: "/tmp/query_id.txt" ''' +# Import python libs import sys import os.path +# Import Salt libs +import salt.utils + def __virtual__(): ''' @@ -168,7 +172,7 @@ def run(name, + grain + ":" + key elif output is not None: ret['changes']['query'] = "Executed. Output into " + output - with open(output, 'w') as output_file: + with salt.utils.fopen(output, 'w') as output_file: if 'results' in query_result: for res in query_result['results']: for col, val in res: From 0c5b32f3ace68bad0e2fd2140763488e929f25a4 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:20:57 +0000 Subject: [PATCH 047/115] Switch `open()` for `salt.utils.fopen()` --- salt/utils/__init__.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/salt/utils/__init__.py b/salt/utils/__init__.py index 589b9dbb4e..a86d61e105 100644 --- a/salt/utils/__init__.py +++ b/salt/utils/__init__.py @@ -305,10 +305,10 @@ def daemonize(redirect_out=True): # not cleanly redirected and the parent process dies when the # multiprocessing process attempts to access stdout or err. if redirect_out: - dev_null = open('/dev/null', 'r+') - os.dup2(dev_null.fileno(), sys.stdin.fileno()) - os.dup2(dev_null.fileno(), sys.stdout.fileno()) - os.dup2(dev_null.fileno(), sys.stderr.fileno()) + with fopen('/dev/null', 'r+') as dev_null: + os.dup2(dev_null.fileno(), sys.stdin.fileno()) + os.dup2(dev_null.fileno(), sys.stdout.fileno()) + os.dup2(dev_null.fileno(), sys.stderr.fileno()) def daemonize_if(opts): @@ -2125,7 +2125,7 @@ def is_bin_file(path): if not os.path.isfile(path): return None try: - with open(path, 'r') as fp_: + with fopen(path, 'r') as fp_: return is_bin_str(fp_.read(2048)) except os.error: return None From c7a6b59bbb44663bfd9ad34f7cd530bfbb62d920 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:21:43 +0000 Subject: [PATCH 048/115] Switch `open()` for `salt.utils.fopen()` --- salt/utils/cloud.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/utils/cloud.py b/salt/utils/cloud.py index ce7d7b3108..81d331c837 100644 --- a/salt/utils/cloud.py +++ b/salt/utils/cloud.py @@ -2129,7 +2129,7 @@ def update_bootstrap(config, url=None): else: script_name = os.path.basename(url) elif os.path.exists(url): - with open(url) as fic: + with salt.utils.fopen(url) as fic: script_content = fic.read() script_name = os.path.basename(url) # in last case, assuming we got a script content From 10124b55f884ab9209518e7c5bdf7713cf6143bc Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:22:51 +0000 Subject: [PATCH 049/115] Switch `open()` for `salt.utils.fopen()` --- salt/utils/network.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/salt/utils/network.py b/salt/utils/network.py index a646761225..8def03bb09 100644 --- a/salt/utils/network.py +++ b/salt/utils/network.py @@ -855,7 +855,7 @@ def active_tcp(): ''' ret = {} if os.path.isfile('/proc/net/tcp'): - with open('/proc/net/tcp', 'rb') as fp_: + with salt.utils.fopen('/proc/net/tcp', 'rb') as fp_: for line in fp_: if line.strip().startswith('sl'): continue @@ -870,7 +870,7 @@ def local_port_tcp(port): ''' ret = set() if os.path.isfile('/proc/net/tcp'): - with open('/proc/net/tcp', 'rb') as fp_: + with salt.utils.fopen('/proc/net/tcp', 'rb') as fp_: for line in fp_: if line.strip().startswith('sl'): continue @@ -890,7 +890,7 @@ def remote_port_tcp(port): ''' ret = set() if os.path.isfile('/proc/net/tcp'): - with open('/proc/net/tcp', 'rb') as fp_: + with salt.utils.fopen('/proc/net/tcp', 'rb') as fp_: for line in fp_: if line.strip().startswith('sl'): continue From a0b060300ec807f2a5560a2cf9fbb9cf43590471 Mon Sep 17 00:00:00 2001 From: "Gareth J. Greenaway" Date: Wed, 26 Nov 2014 11:24:02 -0800 Subject: [PATCH 050/115] Adding missing docs for using cron like format for scheduler --- salt/utils/schedule.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/salt/utils/schedule.py b/salt/utils/schedule.py index 601a733f02..543dbbb797 100644 --- a/salt/utils/schedule.py +++ b/salt/utils/schedule.py @@ -116,6 +116,20 @@ test=True every 3600 seconds (every hour) until the current time is between the of 8am and 5pm. The range parameter must be a dictionary with the date strings using the dateutil format. + ... versionadded:: 2014.7.0 + + schedule: + job1: + function: state.sls + cron: '*/15 * * * *' + args: + - httpd + kwargs: + test: True + +The scheduler also supports scheduling jobs using a cron like format. This requires the +python-croniter library. + The scheduler also supports ensuring that there are no more than N copies of a particular routine running. Use this for jobs that may be long-running and could step on each other or pile up in case of infrastructure outage. From 71bc0b754eea9f0c2a86a8fbf79d3c3c8b71a3ce Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:32:45 +0000 Subject: [PATCH 051/115] Switch `open()` for `salt.utils.fopen()` --- salt/utils/openstack/swift.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/salt/utils/openstack/swift.py b/salt/utils/openstack/swift.py index 549288197f..dd94017439 100644 --- a/salt/utils/openstack/swift.py +++ b/salt/utils/openstack/swift.py @@ -12,6 +12,9 @@ from os import makedirs from os.path import dirname, isdir from errno import EEXIST +# Import Salt libs +import salt.utils + # Get logging started log = logging.getLogger(__name__) @@ -173,7 +176,7 @@ class SaltSwift(object): dirpath = dirname(local_file) if dirpath and not isdir(dirpath): mkdirs(dirpath) - fp = open(local_file, 'wb') + fp = salt.utils.fopen(local_file, 'wb') read_length = 0 for chunk in body: @@ -196,9 +199,8 @@ class SaltSwift(object): Upload a file to Swift ''' try: - fp = open(local_file, 'rb') - self.conn.put_object(cont, obj, fp) - fp.close() + with salt.utils.fopen(local_file, 'rb') as fp_ + self.conn.put_object(cont, obj, fp_) return True except Exception as exc: log.error('There was an error::') From edb1687d195651ac09b60e837f8908180d9a1122 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:34:55 +0000 Subject: [PATCH 052/115] Switch `open()` for `salt.utils.fopen()` --- salt/utils/thin.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/salt/utils/thin.py b/salt/utils/thin.py index 6cc67f3fe2..3efffa3c1d 100644 --- a/salt/utils/thin.py +++ b/salt/utils/thin.py @@ -100,16 +100,17 @@ def gen_thin(cachedir, extra_mods='', overwrite=False, so_mods=''): thintar = os.path.join(thindir, 'thin.tgz') thinver = os.path.join(thindir, 'version') salt_call = os.path.join(thindir, 'salt-call') - with open(salt_call, 'w+') as fp_: + with salt.utils.fopen(salt_call, 'w+') as fp_: fp_.write(SALTCALL) if os.path.isfile(thintar): - if overwrite or not os.path.isfile(thinver): - try: - os.remove(thintar) - except OSError: - pass - elif open(thinver).read() == salt.__version__: - return thintar + with salt.utils.fopen(thinver) as fh_: + if overwrite or not os.path.isfile(thinver): + try: + os.remove(thintar) + except OSError: + pass + elif fh_.read() == salt.__version__: + return thintar tops = [ os.path.dirname(salt.__file__), os.path.dirname(jinja2.__file__), @@ -184,7 +185,7 @@ def gen_thin(cachedir, extra_mods='', overwrite=False, so_mods=''): tempdir = None os.chdir(thindir) tfp.add('salt-call') - with open(thinver, 'w+') as fp_: + with salt.utils.fopen(thinver, 'w+') as fp_: fp_.write(salt.__version__) os.chdir(os.path.dirname(thinver)) tfp.add('version') From d3f419ca84f2c2467257cd69c665364d2006b1c4 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:56:24 +0000 Subject: [PATCH 053/115] Fix undefined variable --- salt/modules/dockerio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/dockerio.py b/salt/modules/dockerio.py index 60f8c9e3b1..662099cd7c 100644 --- a/salt/modules/dockerio.py +++ b/salt/modules/dockerio.py @@ -1944,7 +1944,7 @@ def get_container_root(container): try: lxcconfig = os.path.join(default_path, 'config.lxc') with salt.utils.fopen(lxcconfig) as fhr: - lines = f.readlines() + lines = fhr.readlines() rlines = lines[:] rlines.reverse() for rl in rlines: From 491d251f48a48439bef8c022735574d4fb462381 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 19:57:32 +0000 Subject: [PATCH 054/115] Fix invalid syntax --- salt/utils/openstack/swift.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/utils/openstack/swift.py b/salt/utils/openstack/swift.py index dd94017439..bbd50dacac 100644 --- a/salt/utils/openstack/swift.py +++ b/salt/utils/openstack/swift.py @@ -199,7 +199,7 @@ class SaltSwift(object): Upload a file to Swift ''' try: - with salt.utils.fopen(local_file, 'rb') as fp_ + with salt.utils.fopen(local_file, 'rb') as fp_: self.conn.put_object(cont, obj, fp_) return True except Exception as exc: From f5794f837c63374d997bf0e43dc5e9897e8864e7 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 13:53:27 +0000 Subject: [PATCH 055/115] Update 'doc/.tx/config' - Build #213 http://cookingwithsalt.org/job/salt/job/transifex/213/ Signed-off-by: Pedro Algarvio --- doc/.tx/config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/.tx/config b/doc/.tx/config index 66472219b9..9d2efc0892 100644 --- a/doc/.tx/config +++ b/doc/.tx/config @@ -4868,3 +4868,9 @@ source_file = _build/locale/topics/releases/2014.1.13.pot source_lang = en source_name = topics/releases/2014.1.13.rst +[salt.topics--releases--2014_7_1] +file_filter = locale//LC_MESSAGES/topics/releases/2014.7.1.po +source_file = _build/locale/topics/releases/2014.7.1.pot +source_lang = en +source_name = topics/releases/2014.7.1.rst + From c72a0a9dff35933adedd68b58d7236be2b399e83 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 20:20:47 +0000 Subject: [PATCH 056/115] Dos 2 unix line breaks. Switch `open()` for `salt.utils.fopen()` --- salt/modules/artifactory.py | 685 ++++++++++++++++++------------------ 1 file changed, 344 insertions(+), 341 deletions(-) diff --git a/salt/modules/artifactory.py b/salt/modules/artifactory.py index 69e7d64a22..bb0306123e 100644 --- a/salt/modules/artifactory.py +++ b/salt/modules/artifactory.py @@ -1,341 +1,344 @@ -# -*- coding: utf-8 -*- -''' -Module for fetching artifacts from Artifactory -''' - -# Import python libs -import urllib2 -import os -import xml.etree.ElementTree as ET -from urllib2 import HTTPError -import logging - -log = logging.getLogger(__name__) - - -def get_latest_snapshot(artifactory_url, repository, group_id, artifact_id, packaging, target_dir='/tmp', target_file=None): - ''' - Gets latest snapshot of the given artifact - - artifactory_url - URL of artifactory instance - repository - Snapshot repository in artifactory to retrieve artifact from, for example: libs-snapshots - group_id - Group Id of the artifact - artifact_id - Artifact Id of the artifact - packaging - Packaging type (jar,war,ear,etc) - target_dir - Target directory to download artifact to (default: /tmp) - target_file - Target file to download artifact to (by default it is target_dir/artifact_id-snapshot_version.packaging) - ''' - log.debug("======================== MODULE FUNCTION: artifactory.get_latest_snapshot, artifactory_url=%s, repository=%s, group_id=%s, artifact_id=%s, packaging=%s, target_dir=%s)", - artifactory_url, repository, group_id, artifact_id, packaging, target_dir) - artifact_metadata = _get_artifact_metadata(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id) - version = artifact_metadata['latest_version'] - - snapshot_url, file_name = _get_snapshot_url(artifactory_url, repository, group_id, artifact_id, version, packaging) - target_file = __resolve_target_file(file_name, target_dir, target_file) - - return __save_artifact(snapshot_url, target_file) - - -def get_snapshot(artifactory_url, repository, group_id, artifact_id, packaging, version, snapshot_version=None, target_dir='/tmp', target_file=None): - ''' - Gets snapshot of the desired version of the artifact - - artifactory_url - URL of artifactory instance - repository - Snapshot repository in artifactory to retrieve artifact from, for example: libs-snapshots - group_id - Group Id of the artifact - artifact_id - Artifact Id of the artifact - packaging - Packaging type (jar,war,ear,etc) - version - Version of the artifact - target_dir - Target directory to download artifact to (default: /tmp) - target_file - Target file to download artifact to (by default it is target_dir/artifact_id-snapshot_version.packaging) - ''' - log.debug('======================== MODULE FUNCTION: artifactory.get_snapshot(artifactory_url=%s, repository=%s, group_id=%s, artifact_id=%s, packaging=%s, version=%s, target_dir=%s)', - artifactory_url, repository, group_id, artifact_id, packaging, version, target_dir) - - snapshot_url, file_name = _get_snapshot_url(artifactory_url, repository, group_id, artifact_id, version, packaging, snapshot_version) - target_file = __resolve_target_file(file_name, target_dir, target_file) - - return __save_artifact(snapshot_url, target_file) - - -def get_release(artifactory_url, repository, group_id, artifact_id, packaging, version, target_dir='/tmp', target_file=None): - ''' - Gets the specified release of the artifact - - artifactory_url - URL of artifactory instance - repository - Release repository in artifactory to retrieve artifact from, for example: libs-releases - group_id - Group Id of the artifact - artifact_id - Artifact Id of the artifact - packaging - Packaging type (jar,war,ear,etc) - version - Version of the artifact - target_dir - Target directory to download artifact to (default: /tmp) - target_file - Target file to download artifact to (by default it is target_dir/artifact_id-version.packaging) - ''' - log.debug('======================== MODULE FUNCTION: artifactory.get_release(artifactory_url=%s, repository=%s, group_id=%s, artifact_id=%s, packaging=%s, version=%s, target_dir=%s)', - artifactory_url, repository, group_id, artifact_id, packaging, version, target_dir) - - release_url, file_name = _get_release_url(repository, group_id, artifact_id, packaging, version, artifactory_url) - target_file = __resolve_target_file(file_name, target_dir, target_file) - - return __save_artifact(release_url, target_file) - - -def __resolve_target_file(file_name, target_dir, target_file=None): - if target_file is None: - target_file = os.path.join(target_dir, file_name) - return target_file - - -def _get_snapshot_url(artifactory_url, repository, group_id, artifact_id, version, packaging, snapshot_version=None): - if snapshot_version is None: - snapshot_version_metadata = _get_snapshot_version_metadata(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id, version=version) - if packaging not in snapshot_version_metadata['snapshot_versions']: - error_message = '''Cannot find requested packaging '{packaging}' in the snapshot version metadata. - artifactory_url: {artifactory_url} - repository: {repository} - group_id: {group_id} - artifact_id: {artifact_id} - packaging: {packaging} - version: {version}'''.format( - artifactory_url=artifactory_url, - repository=repository, - group_id=group_id, - artifact_id=artifact_id, - packaging=packaging, - version=version) - raise ArtifactoryError(error_message) - snapshot_version = snapshot_version_metadata['snapshot_versions'][packaging] - - group_url = __get_group_id_subpath(group_id) - - file_name = '{artifact_id}-{snapshot_version}.{packaging}'.format( - artifact_id=artifact_id, - snapshot_version=snapshot_version, - packaging=packaging) - snapshot_url = '{artifactory_url}/{repository}/{group_url}/{artifact_id}/{version}/{file_name}'.format( - artifactory_url=artifactory_url, - repository=repository, - group_url=group_url, - artifact_id=artifact_id, - version=version, - file_name=file_name) - log.debug('snapshot_url=%s', snapshot_url) - - return snapshot_url, file_name - - -def _get_release_url(repository, group_id, artifact_id, packaging, version, artifactory_url): - group_url = __get_group_id_subpath(group_id) - # for released versions the suffix for the file is same as version - file_name = '{artifact_id}-{version}.{packaging}'.format( - artifact_id=artifact_id, - version=version, - packaging=packaging) - - release_url = '{artifactory_url}/{repository}/{group_url}/{artifact_id}/{version}/{file_name}'.format( - artifactory_url=artifactory_url, - repository=repository, - group_url=group_url, - artifact_id=artifact_id, - version=version, - file_name=file_name) - log.debug('release_url=%s', release_url) - return release_url, file_name - - -def _get_artifact_metadata_url(artifactory_url, repository, group_id, artifact_id): - group_url = __get_group_id_subpath(group_id) - # for released versions the suffix for the file is same as version - artifact_metadata_url = '{artifactory_url}/{repository}/{group_url}/{artifact_id}/maven-metadata.xml'.format( - artifactory_url=artifactory_url, - repository=repository, - group_url=group_url, - artifact_id=artifact_id) - log.debug('artifact_metadata_url=%s', artifact_metadata_url) - return artifact_metadata_url - - -def _get_artifact_metadata_xml(artifactory_url, repository, group_id, artifact_id): - artifact_metadata_url = _get_artifact_metadata_url(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id) - try: - artifact_metadata_xml = urllib2.urlopen(artifact_metadata_url).read() - except HTTPError as e: - raise Exception("Could not fetch data from url: {url}, HTTPError: {message}".format(url=artifact_metadata_url, message=e.message)) - - log.debug('artifact_metadata_xml=%s', artifact_metadata_xml) - return artifact_metadata_xml - - -def _get_artifact_metadata(artifactory_url, repository, group_id, artifact_id): - metadata_xml = _get_artifact_metadata_xml(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id) - root = ET.fromstring(metadata_xml) - - assert group_id == root.find('groupId').text - assert artifact_id == root.find('artifactId').text - latest_version = root.find('versioning').find('latest').text - return { - 'latest_version': latest_version - } - - -# functions for handling snapshots -def _get_snapshot_version_metadata_url(artifactory_url, repository, group_id, artifact_id, version): - group_url = __get_group_id_subpath(group_id) - # for released versions the suffix for the file is same as version - snapshot_version_metadata_url = '{artifactory_url}/{repository}/{group_url}/{artifact_id}/{version}/maven-metadata.xml'.format( - artifactory_url=artifactory_url, - repository=repository, - group_url=group_url, - artifact_id=artifact_id, - version=version) - log.debug('snapshot_version_metadata_url=%s', snapshot_version_metadata_url) - return snapshot_version_metadata_url - - -def _get_snapshot_version_metadata_xml(artifactory_url, repository, group_id, artifact_id, version): - snapshot_version_metadata_url = _get_snapshot_version_metadata_url(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id, version=version) - try: - snapshot_version_metadata_xml = urllib2.urlopen(snapshot_version_metadata_url).read() - except HTTPError as e: - raise Exception("Could not fetch data from url: {url}, HTTPError: {message}".format(url=snapshot_version_metadata_url, message=e.message)) - log.debug('snapshot_version_metadata_xml=%s', snapshot_version_metadata_xml) - return snapshot_version_metadata_xml - - -def _get_snapshot_version_metadata(artifactory_url, repository, group_id, artifact_id, version): - metadata_xml = _get_snapshot_version_metadata_xml(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id, version=version) - metadata = ET.fromstring(metadata_xml) - - assert group_id == metadata.find('groupId').text - assert artifact_id == metadata.find('artifactId').text - assert version == metadata.find('version').text - - snapshot_versions = metadata.find('versioning').find('snapshotVersions') - extension_version_dict = {} - for snapshot_version in snapshot_versions: - extension = snapshot_version.find('extension').text - value = snapshot_version.find('value').text - extension_version_dict[extension] = value - - return { - 'snapshot_versions': extension_version_dict - } - - -def __save_artifact(artifact_url, target_file): - log.debug("__save_artifact(%s, %s)", artifact_url, target_file) - result = { - 'status': False, - 'changes': {}, - 'comment': '' - } - - if os.path.isfile(target_file): - log.debug("File %s already exists, checking checksum...") - checksum_url = artifact_url + ".sha1" - - checksum_success, artifact_sum, checksum_comment = __download(checksum_url) - if checksum_success: - log.debug("Downloaded SHA1 SUM: %s", artifact_sum) - file_sum = __salt__['file.get_hash'](path=target_file, form='sha1') - log.debug("Target file (%s) SHA1 SUM: %s", target_file, file_sum) - - if artifact_sum == file_sum: - result['status'] = True - result['target_file'] = target_file - result['comment'] = 'File {0} already exists, checksum matches with Artifactory.\n' \ - 'Checksum URL: {1}'.format(target_file, checksum_url) - return result - else: - result['comment'] = 'File {0} already exists, checksum does not match with Artifactory!\n'\ - 'Checksum URL: {1}'.format(target_file, checksum_url) - - else: - result['status'] = False - result['comment'] = checksum_comment - return result - - log.debug('Downloading: {url} -> {target_file}'.format(url=artifact_url, target_file=target_file)) - try: - f = urllib2.urlopen(artifact_url) - with open(target_file, "wb") as local_file: - local_file.write(f.read()) - result['status'] = True - result['comment'] = __append_comment(('Artifact downloaded from URL: {0}'.format(artifact_url)), result['comment']) - result['changes']['downloaded_file'] = target_file - result['target_file'] = target_file - except (HTTPError, urllib2.URLError) as e: - result['status'] = False - result['comment'] = __get_error_comment(e, artifact_url) - - return result - - -def __get_group_id_subpath(group_id): - group_url = group_id.replace('.', '/') - return group_url - - -def __download(request_url): - log.debug('Downloading content from {0}'.format(request_url)) - - success = False - content = None - comment = None - try: - url = urllib2.urlopen(request_url) - content = url.read() - success = True - except HTTPError as e: - comment = __get_error_comment(e, request_url) - - return success, content, comment - - -def __get_error_comment(http_error, request_url): - if http_error.code == 404: - comment = 'HTTP Error 404. Request URL: ' + request_url - elif http_error.code == 409: - comment = 'HTTP Error 409: Conflict. Requested URL: {0}. \n' \ - 'This error may be caused by reading snapshot artifact from non-snapshot repository.'.format(request_url) - else: - comment = 'HTTP Error {err_code}. Request URL: {url}'.format(err_code=http_error.code, url=request_url) - - return comment - - -def __append_comment(new_comment, current_comment=''): - return current_comment+'\n'+new_comment - - -class ArtifactoryError(Exception): - - def __init__(self, value): - super(ArtifactoryError, self).__init__() - self.value = value - - def __str__(self): - return repr(self.value) +# -*- coding: utf-8 -*- +''' +Module for fetching artifacts from Artifactory +''' + +# Import python libs +import urllib2 +import os +import xml.etree.ElementTree as ET +from urllib2 import HTTPError +import logging + +# Import Salt libs +import salt.utils + +log = logging.getLogger(__name__) + + +def get_latest_snapshot(artifactory_url, repository, group_id, artifact_id, packaging, target_dir='/tmp', target_file=None): + ''' + Gets latest snapshot of the given artifact + + artifactory_url + URL of artifactory instance + repository + Snapshot repository in artifactory to retrieve artifact from, for example: libs-snapshots + group_id + Group Id of the artifact + artifact_id + Artifact Id of the artifact + packaging + Packaging type (jar,war,ear,etc) + target_dir + Target directory to download artifact to (default: /tmp) + target_file + Target file to download artifact to (by default it is target_dir/artifact_id-snapshot_version.packaging) + ''' + log.debug("======================== MODULE FUNCTION: artifactory.get_latest_snapshot, artifactory_url=%s, repository=%s, group_id=%s, artifact_id=%s, packaging=%s, target_dir=%s)", + artifactory_url, repository, group_id, artifact_id, packaging, target_dir) + artifact_metadata = _get_artifact_metadata(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id) + version = artifact_metadata['latest_version'] + + snapshot_url, file_name = _get_snapshot_url(artifactory_url, repository, group_id, artifact_id, version, packaging) + target_file = __resolve_target_file(file_name, target_dir, target_file) + + return __save_artifact(snapshot_url, target_file) + + +def get_snapshot(artifactory_url, repository, group_id, artifact_id, packaging, version, snapshot_version=None, target_dir='/tmp', target_file=None): + ''' + Gets snapshot of the desired version of the artifact + + artifactory_url + URL of artifactory instance + repository + Snapshot repository in artifactory to retrieve artifact from, for example: libs-snapshots + group_id + Group Id of the artifact + artifact_id + Artifact Id of the artifact + packaging + Packaging type (jar,war,ear,etc) + version + Version of the artifact + target_dir + Target directory to download artifact to (default: /tmp) + target_file + Target file to download artifact to (by default it is target_dir/artifact_id-snapshot_version.packaging) + ''' + log.debug('======================== MODULE FUNCTION: artifactory.get_snapshot(artifactory_url=%s, repository=%s, group_id=%s, artifact_id=%s, packaging=%s, version=%s, target_dir=%s)', + artifactory_url, repository, group_id, artifact_id, packaging, version, target_dir) + + snapshot_url, file_name = _get_snapshot_url(artifactory_url, repository, group_id, artifact_id, version, packaging, snapshot_version) + target_file = __resolve_target_file(file_name, target_dir, target_file) + + return __save_artifact(snapshot_url, target_file) + + +def get_release(artifactory_url, repository, group_id, artifact_id, packaging, version, target_dir='/tmp', target_file=None): + ''' + Gets the specified release of the artifact + + artifactory_url + URL of artifactory instance + repository + Release repository in artifactory to retrieve artifact from, for example: libs-releases + group_id + Group Id of the artifact + artifact_id + Artifact Id of the artifact + packaging + Packaging type (jar,war,ear,etc) + version + Version of the artifact + target_dir + Target directory to download artifact to (default: /tmp) + target_file + Target file to download artifact to (by default it is target_dir/artifact_id-version.packaging) + ''' + log.debug('======================== MODULE FUNCTION: artifactory.get_release(artifactory_url=%s, repository=%s, group_id=%s, artifact_id=%s, packaging=%s, version=%s, target_dir=%s)', + artifactory_url, repository, group_id, artifact_id, packaging, version, target_dir) + + release_url, file_name = _get_release_url(repository, group_id, artifact_id, packaging, version, artifactory_url) + target_file = __resolve_target_file(file_name, target_dir, target_file) + + return __save_artifact(release_url, target_file) + + +def __resolve_target_file(file_name, target_dir, target_file=None): + if target_file is None: + target_file = os.path.join(target_dir, file_name) + return target_file + + +def _get_snapshot_url(artifactory_url, repository, group_id, artifact_id, version, packaging, snapshot_version=None): + if snapshot_version is None: + snapshot_version_metadata = _get_snapshot_version_metadata(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id, version=version) + if packaging not in snapshot_version_metadata['snapshot_versions']: + error_message = '''Cannot find requested packaging '{packaging}' in the snapshot version metadata. + artifactory_url: {artifactory_url} + repository: {repository} + group_id: {group_id} + artifact_id: {artifact_id} + packaging: {packaging} + version: {version}'''.format( + artifactory_url=artifactory_url, + repository=repository, + group_id=group_id, + artifact_id=artifact_id, + packaging=packaging, + version=version) + raise ArtifactoryError(error_message) + snapshot_version = snapshot_version_metadata['snapshot_versions'][packaging] + + group_url = __get_group_id_subpath(group_id) + + file_name = '{artifact_id}-{snapshot_version}.{packaging}'.format( + artifact_id=artifact_id, + snapshot_version=snapshot_version, + packaging=packaging) + snapshot_url = '{artifactory_url}/{repository}/{group_url}/{artifact_id}/{version}/{file_name}'.format( + artifactory_url=artifactory_url, + repository=repository, + group_url=group_url, + artifact_id=artifact_id, + version=version, + file_name=file_name) + log.debug('snapshot_url=%s', snapshot_url) + + return snapshot_url, file_name + + +def _get_release_url(repository, group_id, artifact_id, packaging, version, artifactory_url): + group_url = __get_group_id_subpath(group_id) + # for released versions the suffix for the file is same as version + file_name = '{artifact_id}-{version}.{packaging}'.format( + artifact_id=artifact_id, + version=version, + packaging=packaging) + + release_url = '{artifactory_url}/{repository}/{group_url}/{artifact_id}/{version}/{file_name}'.format( + artifactory_url=artifactory_url, + repository=repository, + group_url=group_url, + artifact_id=artifact_id, + version=version, + file_name=file_name) + log.debug('release_url=%s', release_url) + return release_url, file_name + + +def _get_artifact_metadata_url(artifactory_url, repository, group_id, artifact_id): + group_url = __get_group_id_subpath(group_id) + # for released versions the suffix for the file is same as version + artifact_metadata_url = '{artifactory_url}/{repository}/{group_url}/{artifact_id}/maven-metadata.xml'.format( + artifactory_url=artifactory_url, + repository=repository, + group_url=group_url, + artifact_id=artifact_id) + log.debug('artifact_metadata_url=%s', artifact_metadata_url) + return artifact_metadata_url + + +def _get_artifact_metadata_xml(artifactory_url, repository, group_id, artifact_id): + artifact_metadata_url = _get_artifact_metadata_url(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id) + try: + artifact_metadata_xml = urllib2.urlopen(artifact_metadata_url).read() + except HTTPError as e: + raise Exception("Could not fetch data from url: {url}, HTTPError: {message}".format(url=artifact_metadata_url, message=e.message)) + + log.debug('artifact_metadata_xml=%s', artifact_metadata_xml) + return artifact_metadata_xml + + +def _get_artifact_metadata(artifactory_url, repository, group_id, artifact_id): + metadata_xml = _get_artifact_metadata_xml(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id) + root = ET.fromstring(metadata_xml) + + assert group_id == root.find('groupId').text + assert artifact_id == root.find('artifactId').text + latest_version = root.find('versioning').find('latest').text + return { + 'latest_version': latest_version + } + + +# functions for handling snapshots +def _get_snapshot_version_metadata_url(artifactory_url, repository, group_id, artifact_id, version): + group_url = __get_group_id_subpath(group_id) + # for released versions the suffix for the file is same as version + snapshot_version_metadata_url = '{artifactory_url}/{repository}/{group_url}/{artifact_id}/{version}/maven-metadata.xml'.format( + artifactory_url=artifactory_url, + repository=repository, + group_url=group_url, + artifact_id=artifact_id, + version=version) + log.debug('snapshot_version_metadata_url=%s', snapshot_version_metadata_url) + return snapshot_version_metadata_url + + +def _get_snapshot_version_metadata_xml(artifactory_url, repository, group_id, artifact_id, version): + snapshot_version_metadata_url = _get_snapshot_version_metadata_url(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id, version=version) + try: + snapshot_version_metadata_xml = urllib2.urlopen(snapshot_version_metadata_url).read() + except HTTPError as e: + raise Exception("Could not fetch data from url: {url}, HTTPError: {message}".format(url=snapshot_version_metadata_url, message=e.message)) + log.debug('snapshot_version_metadata_xml=%s', snapshot_version_metadata_xml) + return snapshot_version_metadata_xml + + +def _get_snapshot_version_metadata(artifactory_url, repository, group_id, artifact_id, version): + metadata_xml = _get_snapshot_version_metadata_xml(artifactory_url=artifactory_url, repository=repository, group_id=group_id, artifact_id=artifact_id, version=version) + metadata = ET.fromstring(metadata_xml) + + assert group_id == metadata.find('groupId').text + assert artifact_id == metadata.find('artifactId').text + assert version == metadata.find('version').text + + snapshot_versions = metadata.find('versioning').find('snapshotVersions') + extension_version_dict = {} + for snapshot_version in snapshot_versions: + extension = snapshot_version.find('extension').text + value = snapshot_version.find('value').text + extension_version_dict[extension] = value + + return { + 'snapshot_versions': extension_version_dict + } + + +def __save_artifact(artifact_url, target_file): + log.debug("__save_artifact(%s, %s)", artifact_url, target_file) + result = { + 'status': False, + 'changes': {}, + 'comment': '' + } + + if os.path.isfile(target_file): + log.debug("File %s already exists, checking checksum...") + checksum_url = artifact_url + ".sha1" + + checksum_success, artifact_sum, checksum_comment = __download(checksum_url) + if checksum_success: + log.debug("Downloaded SHA1 SUM: %s", artifact_sum) + file_sum = __salt__['file.get_hash'](path=target_file, form='sha1') + log.debug("Target file (%s) SHA1 SUM: %s", target_file, file_sum) + + if artifact_sum == file_sum: + result['status'] = True + result['target_file'] = target_file + result['comment'] = 'File {0} already exists, checksum matches with Artifactory.\n' \ + 'Checksum URL: {1}'.format(target_file, checksum_url) + return result + else: + result['comment'] = 'File {0} already exists, checksum does not match with Artifactory!\n'\ + 'Checksum URL: {1}'.format(target_file, checksum_url) + + else: + result['status'] = False + result['comment'] = checksum_comment + return result + + log.debug('Downloading: {url} -> {target_file}'.format(url=artifact_url, target_file=target_file)) + try: + f = urllib2.urlopen(artifact_url) + with salt.utils.fopen(target_file, "wb") as local_file: + local_file.write(f.read()) + result['status'] = True + result['comment'] = __append_comment(('Artifact downloaded from URL: {0}'.format(artifact_url)), result['comment']) + result['changes']['downloaded_file'] = target_file + result['target_file'] = target_file + except (HTTPError, urllib2.URLError) as e: + result['status'] = False + result['comment'] = __get_error_comment(e, artifact_url) + + return result + + +def __get_group_id_subpath(group_id): + group_url = group_id.replace('.', '/') + return group_url + + +def __download(request_url): + log.debug('Downloading content from {0}'.format(request_url)) + + success = False + content = None + comment = None + try: + url = urllib2.urlopen(request_url) + content = url.read() + success = True + except HTTPError as e: + comment = __get_error_comment(e, request_url) + + return success, content, comment + + +def __get_error_comment(http_error, request_url): + if http_error.code == 404: + comment = 'HTTP Error 404. Request URL: ' + request_url + elif http_error.code == 409: + comment = 'HTTP Error 409: Conflict. Requested URL: {0}. \n' \ + 'This error may be caused by reading snapshot artifact from non-snapshot repository.'.format(request_url) + else: + comment = 'HTTP Error {err_code}. Request URL: {url}'.format(err_code=http_error.code, url=request_url) + + return comment + + +def __append_comment(new_comment, current_comment=''): + return current_comment+'\n'+new_comment + + +class ArtifactoryError(Exception): + + def __init__(self, value): + super(ArtifactoryError, self).__init__() + self.value = value + + def __str__(self): + return repr(self.value) From 7fcd8af68c3dd5ca7bca0576caba6ae3e8c6a108 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 20:21:41 +0000 Subject: [PATCH 057/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/cyg.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/salt/modules/cyg.py b/salt/modules/cyg.py index a64b19996e..1bc2573353 100644 --- a/salt/modules/cyg.py +++ b/salt/modules/cyg.py @@ -129,7 +129,8 @@ def _run_silent_cygwin(cyg_arch='x86_64', os.remove(cyg_setup_path) file_data = _urlopen(cyg_setup_source) - open(cyg_setup_path, "wb").write(file_data.read()) + with salt.utils.fopen(cyg_setup_path, "wb") as fhw: + fhw.write(file_data.read()) setup_command = cyg_setup_path options = [] From a32818870c7b0e93f89832568533a3f8e2edeae5 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 20:22:38 +0000 Subject: [PATCH 058/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/fsutils.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/salt/modules/fsutils.py b/salt/modules/fsutils.py index ff2b6502b9..edd7ecf8ee 100644 --- a/salt/modules/fsutils.py +++ b/salt/modules/fsutils.py @@ -11,6 +11,7 @@ import re import logging # Import Salt libs +import salt.utils from salt.exceptions import CommandExecutionError log = logging.getLogger(__name__) @@ -35,17 +36,18 @@ def _get_mounts(fs_type): List mounted filesystems. ''' mounts = {} - for line in open("/proc/mounts").readlines(): - device, mntpnt, fstype, options, fs_freq, fs_passno = line.strip().split(" ") - if fstype != fs_type: - continue - if mounts.get(device) is None: - mounts[device] = [] + with salt.utils.fopen("/proc/mounts") as fhr: + for line in fhr.readlines(): + device, mntpnt, fstype, options, fs_freq, fs_passno = line.strip().split(" ") + if fstype != fs_type: + continue + if mounts.get(device) is None: + mounts[device] = [] - mounts[device].append({ - 'mount_point': mntpnt, - 'options': options.split(",") - }) + mounts[device].append({ + 'mount_point': mntpnt, + 'options': options.split(",") + }) return mounts From 316c1ad80b0ec7449b8378ca049717ccefc0e2ac Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 20:23:16 +0000 Subject: [PATCH 059/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/state.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/state.py b/salt/modules/state.py index f8d8d96d46..7557649f7f 100644 --- a/salt/modules/state.py +++ b/salt/modules/state.py @@ -322,7 +322,7 @@ def check_request(name=None): notify_path = os.path.join(__opts__['cachedir'], 'req_state.p') serial = salt.payload.Serial(__opts__) if os.path.isfile(notify_path): - with open(notify_path, 'rb') as fp_: + with salt.utils.fopen(notify_path, 'rb') as fp_: req = serial.load(fp_) if name: return req[name] From 1ec10692de828e069c0e8c455ce23919e4ff5240 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 20:23:59 +0000 Subject: [PATCH 060/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/syslog_ng.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/salt/modules/syslog_ng.py b/salt/modules/syslog_ng.py index 00b5333d94..ec80cbf0ec 100644 --- a/salt/modules/syslog_ng.py +++ b/salt/modules/syslog_ng.py @@ -1140,9 +1140,7 @@ def _write_config(config, newlines=2): text = config[key] try: - open_flags = 'a' - - with open(__SYSLOG_NG_CONFIG_FILE, open_flags) as f: + with salt.utils.fopen(__SYSLOG_NG_CONFIG_FILE, 'a') as f: f.write(text) for i in range(0, newlines): From acd615d486068c853f2a78d9d3f52d670945a9c3 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 20:24:40 +0000 Subject: [PATCH 061/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/upstart.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/upstart.py b/salt/modules/upstart.py index e96da43f75..3bcc3a9b6c 100644 --- a/salt/modules/upstart.py +++ b/salt/modules/upstart.py @@ -427,7 +427,7 @@ def _upstart_disable(name): Disable an Upstart service. ''' override = '/etc/init/{0}.override'.format(name) - with open(override, 'w') as ofile: + with salt.utils.fopen(override, 'w') as ofile: ofile.write('manual') return _upstart_is_disabled(name) From 643d66070ad52e23729b999bc639652f12dc81fa Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 20:25:40 +0000 Subject: [PATCH 062/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/xfs.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/salt/modules/xfs.py b/salt/modules/xfs.py index 935afd299c..55bce7aa35 100644 --- a/salt/modules/xfs.py +++ b/salt/modules/xfs.py @@ -502,14 +502,15 @@ def _get_mounts(): List mounted filesystems. ''' mounts = {} - for line in open("/proc/mounts").readlines(): - device, mntpnt, fstype, options, fs_freq, fs_passno = line.strip().split(" ") - if fstype != 'xfs': - continue - mounts[device] = { - 'mount_point': mntpnt, - 'options': options.split(","), - } + with salt.utils.fopen("/proc/mounts") as fhr: + for line in fhr.readlines(): + device, mntpnt, fstype, options, fs_freq, fs_passno = line.strip().split(" ") + if fstype != 'xfs': + continue + mounts[device] = { + 'mount_point': mntpnt, + 'options': options.split(","), + } return mounts From 89778fd9ddfaef2cb37c7b259245f93d5161b8ed Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 20:26:44 +0000 Subject: [PATCH 063/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/zypper.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/salt/modules/zypper.py b/salt/modules/zypper.py index 47961bc136..cbecb393eb 100644 --- a/salt/modules/zypper.py +++ b/salt/modules/zypper.py @@ -790,13 +790,14 @@ def list_locks(): return False locks = {} - for meta in [item.split('\n') for item in open(LOCKS).read().split('\n\n')]: - lock = {} - for element in [el for el in meta if el]: - if ':' in element: - lock.update(dict([tuple([i.strip() for i in element.split(':', 1)]), ])) - if lock.get('solvable_name'): - locks[lock.pop('solvable_name')] = lock + with salt.utils.fopen(LOCKS) as fhr: + for meta in [item.split('\n') for item in fhr.read().split('\n\n')]: + lock = {} + for element in [el for el in meta if el]: + if ':' in element: + lock.update(dict([tuple([i.strip() for i in element.split(':', 1)]), ])) + if lock.get('solvable_name'): + locks[lock.pop('solvable_name')] = lock return locks From 1c65fa2db478e789bdc460619d732bc90df86317 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 20:27:51 +0000 Subject: [PATCH 064/115] Switch `open()` for `salt.utils.fopen()` --- salt/pillar/file_tree.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/salt/pillar/file_tree.py b/salt/pillar/file_tree.py index 60356d24ab..4ae2bba0f1 100644 --- a/salt/pillar/file_tree.py +++ b/salt/pillar/file_tree.py @@ -173,9 +173,10 @@ def _construct_pillar(top_dir, follow_dir_links, raw_data=False): continue try: - pillar_node[file_name] = open(file_path, 'rb').read() - if raw_data is False and pillar_node[file_name].endswith('\n'): - pillar_node[file_name] = pillar_node[file_name][:-1] + with salt.utils.fopen(file_path, 'rb') as fhr: + pillar_node[file_name] = fhr.read() + if raw_data is False and pillar_node[file_name].endswith('\n'): + pillar_node[file_name] = pillar_node[file_name][:-1] except IOError as err: log.error('%s', str(err)) From bd7f23ac6f1a7c39c81e339ff1a08dc3a2ae3b31 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 20:30:13 +0000 Subject: [PATCH 065/115] Switch `open()` for `salt.utils.fopen()` --- tests/unit/states/syslog_ng_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/states/syslog_ng_test.py b/tests/unit/states/syslog_ng_test.py index 593d25cc01..34d9bb04c1 100644 --- a/tests/unit/states/syslog_ng_test.py +++ b/tests/unit/states/syslog_ng_test.py @@ -14,6 +14,7 @@ from salttesting.mock import NO_MOCK, NO_MOCK_REASON, MagicMock, patch ensure_in_syspath('../../') +import salt.utils from salt.states import syslog_ng from salt.modules import syslog_ng as syslog_ng_module @@ -360,7 +361,7 @@ class SyslogNGTestCase(TestCase): got = syslog_ng.config(id, config=parsed_yaml_config, write=True) written_config = "" - with open(config_file_name, "r") as f: + with salt.utils.fopen(config_file_name, "r") as f: written_config = f.read() config_without_whitespaces = remove_whitespaces(written_config) From f41cc45a8ff719e617978f22735fb185385a03b1 Mon Sep 17 00:00:00 2001 From: "C. R. Oldham" Date: Wed, 26 Nov 2014 13:35:53 -0700 Subject: [PATCH 066/115] Switch nssm back to 32-bit --- pkg/windows/buildenv/nssm.exe | Bin 331264 -> 294912 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pkg/windows/buildenv/nssm.exe b/pkg/windows/buildenv/nssm.exe index 6ccfe3cfb85f0f7126648dceb7ac93d58b025a0f..8faee45b7a619de41f6463ecf170391467deb199 100644 GIT binary patch literal 294912 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 z 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 Date: Wed, 26 Nov 2014 20:49:04 +0000 Subject: [PATCH 067/115] Fix the `with` context --- tests/integration/shell/call.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/integration/shell/call.py b/tests/integration/shell/call.py index 749e6a14ac..4de1d1e093 100644 --- a/tests/integration/shell/call.py +++ b/tests/integration/shell/call.py @@ -273,11 +273,11 @@ class CallTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): with salt.utils.fopen(self.get_config_file_path('minion'), 'r') as fh_: minion_config = yaml.load(fh_.read()) - minion_config['log_file'] = 'file:///dev/log/LOG_LOCAL3' - with salt.utils.fopen(os.path.join(config_dir, 'minion'), 'w') as fh_: - fh_.write( - yaml.dump(minion_config, default_flow_style=False) - ) + minion_config['log_file'] = 'file:///dev/log/LOG_LOCAL3' + with salt.utils.fopen(os.path.join(config_dir, 'minion'), 'w') as fh_: + fh_.write( + yaml.dump(minion_config, default_flow_style=False) + ) ret = self.run_script( 'salt-call', '--config-dir {0} cmd.run "echo foo"'.format( From 1eeb02d93ff4f76c453dbe6dc31cd47b54fbdb70 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 21:07:39 +0000 Subject: [PATCH 068/115] Add a missed `with` --- tests/integration/shell/cp.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/integration/shell/cp.py b/tests/integration/shell/cp.py index a794e1dfc6..0d159d9299 100644 --- a/tests/integration/shell/cp.py +++ b/tests/integration/shell/cp.py @@ -122,14 +122,13 @@ class CopyTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): os.chdir(config_dir) config_file_name = 'master' - config = yaml.load( - salt.utils.fopen(self.get_config_file_path(config_file_name), 'r').read() - ) - config['log_file'] = 'file:///dev/log/LOG_LOCAL3' - with salt.utils.fopen(os.path.join(config_dir, config_file_name), 'w') as fh_: - fh_.write( - yaml.dump(config, default_flow_style=False) - ) + with salt.utils.fopen(self.get_config_file_path(config_file_name), 'r') as fhr: + config = yaml.load(fhr.read()) + config['log_file'] = 'file:///dev/log/LOG_LOCAL3' + with salt.utils.fopen(os.path.join(config_dir, config_file_name), 'w') as fhw: + fhw.write( + yaml.dump(config, default_flow_style=False) + ) ret = self.run_script( self._call_binary_, From aaf0f4aba045e4dab8105314dabcb775720ed5e2 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 21:08:13 +0000 Subject: [PATCH 069/115] Fix imports --- tests/unit/modules/hashutil_test.py | 3 ++- tests/unit/templates/jinja_test.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/unit/modules/hashutil_test.py b/tests/unit/modules/hashutil_test.py index b253e3af88..31da7334c4 100644 --- a/tests/unit/modules/hashutil_test.py +++ b/tests/unit/modules/hashutil_test.py @@ -1,7 +1,8 @@ # coding: utf-8 import salt.loader -from tests.integration import ModuleCase +from salttesting.helpers import ensure_in_syspath +from salttesting.case import ModuleCase class HashutilTestCase(ModuleCase): diff --git a/tests/unit/templates/jinja_test.py b/tests/unit/templates/jinja_test.py index 3bfbd6647c..fe38cb4e72 100644 --- a/tests/unit/templates/jinja_test.py +++ b/tests/unit/templates/jinja_test.py @@ -8,8 +8,8 @@ import datetime import pprint # Import Salt Testing libs -from tests.integration import ModuleCase -from salttesting import skipIf, TestCase +from salttesting.unit import skipIf, TestCase +from salttesting.case import ModuleCase from salttesting.helpers import ensure_in_syspath ensure_in_syspath('../../') From b8b4158377572fb88ec48bab4276e04ce86d9017 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 21:52:30 +0000 Subject: [PATCH 070/115] Remove unused import --- tests/unit/modules/hashutil_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/modules/hashutil_test.py b/tests/unit/modules/hashutil_test.py index 31da7334c4..95a46140ce 100644 --- a/tests/unit/modules/hashutil_test.py +++ b/tests/unit/modules/hashutil_test.py @@ -1,7 +1,6 @@ # coding: utf-8 import salt.loader -from salttesting.helpers import ensure_in_syspath from salttesting.case import ModuleCase From 87352429064a719556f38ef9f1e02d77f860d136 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 23:13:19 +0000 Subject: [PATCH 071/115] We need to call `read()`! --- tests/integration/shell/key.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/shell/key.py b/tests/integration/shell/key.py index 7d76dccc2f..663b4a8bf2 100644 --- a/tests/integration/shell/key.py +++ b/tests/integration/shell/key.py @@ -233,7 +233,7 @@ class KeyTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): config_file_name = 'master' with salt.utils.fopen(self.get_config_file_path(config_file_name), 'r') as fhr: - config = yaml.load(fhr.ready()) + config = yaml.load(fhr.read()) config['log_file'] = 'file:///dev/log/LOG_LOCAL3' with salt.utils.fopen(os.path.join(config_dir, config_file_name), 'w') as fhw: fhw.write( From 18a5851d9d3584dd357d9a6d558ea0c7bfbddd58 Mon Sep 17 00:00:00 2001 From: Warren Turkal Date: Wed, 26 Nov 2014 15:16:36 -0800 Subject: [PATCH 072/115] Handle errors while unpickling. The metadata cache for s3 can get corrupted. If unpickling raises such an error we should just refetch the data from s3. --- salt/fileserver/s3fs.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/salt/fileserver/s3fs.py b/salt/fileserver/s3fs.py index 5059df78f0..e9bed0d78d 100644 --- a/salt/fileserver/s3fs.py +++ b/salt/fileserver/s3fs.py @@ -332,12 +332,17 @@ def _init(): cache_file = _get_buckets_cache_filename() exp = time.time() - _s3_cache_expire + metadata = None + # check mtime of the buckets files cache if os.path.isfile(cache_file) and os.path.getmtime(cache_file) > exp: - return _read_buckets_cache_file(cache_file) - else: + metadata = _read_buckets_cache_file(cache_file) + + if metadata is None: # bucket files cache expired - return _refresh_buckets_cache_file(cache_file) + metadata = _refresh_buckets_cache_file(cache_file) + + return metadata def _get_cache_dir(): @@ -460,7 +465,11 @@ def _read_buckets_cache_file(cache_file): log.debug('Reading buckets cache file') with salt.utils.fopen(cache_file, 'rb') as fp_: - data = pickle.load(fp_) + try: + data = pickle.load(fp_) + except (pickle.UnpicklingError, AttributeError, EOFError, ImportError, + IndexError, KeyError): + data = None return data From 1857a0d31fd2a75cb1a27b30ef97c3bb3304dd5c Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 23:30:18 +0000 Subject: [PATCH 073/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/call.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/integration/shell/call.py b/tests/integration/shell/call.py index 4de1d1e093..6ee9e25cc6 100644 --- a/tests/integration/shell/call.py +++ b/tests/integration/shell/call.py @@ -139,7 +139,9 @@ class CallTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): if not os.path.isdir(config_dir): os.makedirs(config_dir) - master_config = yaml.load(open(self.get_config_file_path('master')).read()) + with salt.utils.fopen(self.get_config_file_path('master')) as fhr: + master_config = yaml.load(fhr.read()) + master_root_dir = master_config['root_dir'] this_minion_key = os.path.join( master_root_dir, 'pki', 'minions', 'minion_test_issue_2731' From bea345e72005f4f48ec1088912599e5d13ee906e Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 23:35:31 +0000 Subject: [PATCH 074/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/master.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/integration/shell/master.py b/tests/integration/shell/master.py index 57e1518922..151ae2412a 100644 --- a/tests/integration/shell/master.py +++ b/tests/integration/shell/master.py @@ -61,10 +61,11 @@ class MasterTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): # Now kill it if still running if os.path.exists(pid_path): - try: - os.kill(int(open(pid_path).read()), signal.SIGKILL) - except OSError: - pass + with salt.utils.fopen(pid_path) as fhr: + try: + os.kill(int(fhr.read()), signal.SIGKILL) + except OSError: + pass try: self.assertFalse(os.path.isdir(os.path.join(config_dir, 'file:'))) self.assertIn( From d957d2e911b92e240c8f5e8ad85219cb3247266b Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 23:36:26 +0000 Subject: [PATCH 075/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/minion.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/integration/shell/minion.py b/tests/integration/shell/minion.py index bee376084d..5d66a0f859 100644 --- a/tests/integration/shell/minion.py +++ b/tests/integration/shell/minion.py @@ -58,10 +58,11 @@ class MinionTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): # Now kill it if still running if os.path.exists(pid_path): - try: - os.kill(int(open(pid_path).read()), signal.SIGKILL) - except OSError: - pass + with salt.utils.fopen(pid_path) as fhr: + try: + os.kill(int(fhr.read()), signal.SIGKILL) + except OSError: + pass try: self.assertFalse(os.path.isdir(os.path.join(config_dir, 'file:'))) self.assertIn( From 62ec46d6dddf1eb0054861d886ab6493d56670d5 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 23:37:01 +0000 Subject: [PATCH 076/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/shell/syndic.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/integration/shell/syndic.py b/tests/integration/shell/syndic.py index 82de5b7381..e02cc6e262 100644 --- a/tests/integration/shell/syndic.py +++ b/tests/integration/shell/syndic.py @@ -62,10 +62,11 @@ class SyndicTest(integration.ShellCase, integration.ShellCaseCommonTestsMixIn): # Now kill it if still running if os.path.exists(pid_path): - try: - os.kill(int(open(pid_path).read()), signal.SIGKILL) - except OSError: - pass + with salt.utils.fopen(pid_path) as fhr: + try: + os.kill(int(fhr.read()), signal.SIGKILL) + except OSError: + pass try: self.assertFalse(os.path.isdir(os.path.join(config_dir, 'file:'))) self.assertIn( From 78bc5107eed974dd61bf1b9f5fd391ce0eb09a9a Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 23:38:34 +0000 Subject: [PATCH 077/115] Switch `open()` for `salt.utils.fopen()` --- tests/integration/__init__.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py index 360954e12f..f5f55fc8a6 100644 --- a/tests/integration/__init__.py +++ b/tests/integration/__init__.py @@ -726,11 +726,12 @@ class TestDaemon(object): except OSError as exc: if exc.errno != 3: raise - try: - os.kill(int(open(self.sshd_pidfile).read()), signal.SIGKILL) - except OSError as exc: - if exc.errno != 3: - raise + with salt.utils.fopen(self.sshd_pidfile) as fhr: + try: + os.kill(int(fhr.read()), signal.SIGKILL) + except OSError as exc: + if exc.errno != 3: + raise def _exit_mockbin(self): path = os.environ.get('PATH', '') From f28d134d366fb74917c9c3936a3f5002078bfc6f Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 23:39:47 +0000 Subject: [PATCH 078/115] Switch `open()` for `salt.utils.fopen()` --- salt/cloud/libcloudfuncs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/salt/cloud/libcloudfuncs.py b/salt/cloud/libcloudfuncs.py index 95ce5c88c8..78c941dac5 100644 --- a/salt/cloud/libcloudfuncs.py +++ b/salt/cloud/libcloudfuncs.py @@ -117,8 +117,8 @@ def ssh_pub(vm_): ssh = os.path.expanduser(ssh) if os.path.isfile(ssh): return None - - return SSHKeyDeployment(open(ssh).read()) + with salt.utils.fopen(ssh) as fhr: + return SSHKeyDeployment(fhr.read()) def avail_locations(conn=None, call=None): From 3c31fce73606a419b6193f59887068d83110f3cb Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 23:40:43 +0000 Subject: [PATCH 079/115] Switch `open()` for `salt.utils.fopen()` --- salt/modules/defaults.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/salt/modules/defaults.py b/salt/modules/defaults.py index 5d807229f9..53f75c8f48 100644 --- a/salt/modules/defaults.py +++ b/salt/modules/defaults.py @@ -44,7 +44,8 @@ def _load(pillar_name, defaults_path): for loader in json, yaml: defaults_file = os.path.join(defaults_path, 'defaults.' + loader.__name__) if os.path.exists(defaults_file): - defaults = loader.load(open(defaults_file)) + with salt.utils.fopen(defaults_file) as fhr: + defaults = loader.load(fhr) return defaults From 33ee04d835a41aa1960eefe776412c4011a74145 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Wed, 26 Nov 2014 23:44:16 +0000 Subject: [PATCH 080/115] Switch `open()` for `salt.utils.fopen()` --- salt/pillar/pepa.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/salt/pillar/pepa.py b/salt/pillar/pepa.py index 043c6d5555..84a0afda9a 100644 --- a/salt/pillar/pepa.py +++ b/salt/pillar/pepa.py @@ -276,6 +276,9 @@ import jinja2 import re from os.path import isfile, join +# Import Salt libs +import salt.utils + # Only used when called from a terminal log = None if __name__ == '__main__': @@ -408,7 +411,8 @@ def ext_pillar(minion_id, pillar, resource, sequence, subkey=False, subkey_only= fn = join(templdir, re.sub(r'\W', '_', entry.lower()) + '.yaml') if isfile(fn): log.info("Loading template: {0}".format(fn)) - template = jinja2.Template(open(fn).read()) + with salt.utils.fopen(fn) as fhr: + template = jinja2.Template(fhr.read()) output['pepa_templates'].append(fn) try: @@ -504,7 +508,8 @@ def validate(output, resource): pepa_schemas = [] for fn in glob.glob(valdir + '/*.yaml'): log.info("Loading schema: {0}".format(fn)) - template = jinja2.Template(open(fn).read()) + with salt.utils.fopen(fn) as fhr: + template = jinja2.Template(fhr.read()) data = output data['grains'] = __grains__.copy() data['pillar'] = __pillar__.copy() @@ -529,7 +534,8 @@ if __name__ == '__main__': sys.exit(1) # Get configuration - __opts__.update(yaml.load(open(args.config).read())) + with salt.utils.fopen(args.config) as fh_: + __opts__.update(yaml.load(fh_.read())) loc = 0 for name in [e.iterkeys().next() for e in __opts__['ext_pillar']]: From c92cdedc8de2391e9520a0c7c530548b75025c76 Mon Sep 17 00:00:00 2001 From: Seth House Date: Thu, 27 Nov 2014 00:25:10 -0700 Subject: [PATCH 081/115] Switch to RAET-compatible event listener --- salt/runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/runner.py b/salt/runner.py index 9cdf8d0b97..99253ea4b7 100644 --- a/salt/runner.py +++ b/salt/runner.py @@ -45,7 +45,7 @@ class RunnerClient(mixins.SyncClientMixin, mixins.AsyncClientMixin, object): def __init__(self, opts): self.opts = opts self.functions = salt.loader.runner(opts) # Must be self.functions for mixin to work correctly :-/ - self.event = salt.utils.event.MasterEvent(self.opts['sock_dir']) + self.event = salt.utils.event.get_event('master', self.opts['sock_dir'], self.opts['transport']) def cmd(self, fun, arg, pub_data=None, kwarg=None): ''' From 0c9da726f51956b35d71b4d08583f0b5745d4af7 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Thu, 27 Nov 2014 21:16:35 +0000 Subject: [PATCH 082/115] Switch `open()` for `salt.utils.fopen()` --- salt/states/file.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/salt/states/file.py b/salt/states/file.py index 61e7ad269f..3e579f7670 100644 --- a/salt/states/file.py +++ b/salt/states/file.py @@ -3872,9 +3872,11 @@ def serialize(name, if merge_if_exists: if os.path.isfile(name): if formatter == 'yaml': - existing_data = yaml.safe_load(open(name, 'r')) + with salt.utils.fopen(name, 'r') as fhr: + existing_data = yaml.safe_load(fhr.read()) elif formatter == 'json': - existing_data = json.load(open(name, 'r')) + with salt.utils.fopen(name, 'r') as fhr: + existing_data = json.load(fhr.read()) else: return {'changes': {}, 'comment': ('{0} format is not supported for merging' From 68de0b370309d94c1e1ae2cfabc32ae7cbaa3f13 Mon Sep 17 00:00:00 2001 From: Elias Probst Date: Thu, 27 Nov 2014 22:27:36 +0100 Subject: [PATCH 083/115] Prevent 'DSID-0C0906E8' error when binding to ActiveDirectory. --- salt/pillar/pillar_ldap.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/salt/pillar/pillar_ldap.py b/salt/pillar/pillar_ldap.py index 8ba6326292..33c4dcc349 100644 --- a/salt/pillar/pillar_ldap.py +++ b/salt/pillar/pillar_ldap.py @@ -117,8 +117,10 @@ def _do_search(conf): ''' # Build LDAP connection args connargs = {} - for name in ['server', 'port', 'tls', 'binddn', 'bindpw']: + for name in ['server', 'port', 'tls', 'binddn', 'bindpw', 'anonymous']: connargs[name] = _config(name, conf) + if connargs['binddn'] and connargs['bindpw']: + connargs['anonymous'] = False # Build search args try: _filter = conf['filter'] From 6a5b2f6dee9525b2fda28bd696960c67a1644dc1 Mon Sep 17 00:00:00 2001 From: Elias Probst Date: Thu, 27 Nov 2014 23:12:09 +0100 Subject: [PATCH 084/115] Move the log message in case no results were returned into the right block --- salt/pillar/pillar_ldap.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/pillar/pillar_ldap.py b/salt/pillar/pillar_ldap.py index 8ba6326292..ce6ac13a9a 100644 --- a/salt/pillar/pillar_ldap.py +++ b/salt/pillar/pillar_ldap.py @@ -135,12 +135,12 @@ def _do_search(conf): try: result = __salt__['ldap.search'](_filter, _dn, scope, attrs, **connargs)['results'][0][1] + except IndexError: # we got no results for this search log.debug( 'LDAP search returned no results for filter {0}'.format( _filter ) ) - except IndexError: # we got no results for this search result = {} except Exception: log.critical( From c038184ca76de87bb84ec902ce08ff5aa816dd66 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:26:47 +0000 Subject: [PATCH 085/115] Disable some Pylint errors --- salt/modules/boto_secgroup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/salt/modules/boto_secgroup.py b/salt/modules/boto_secgroup.py index f4ddfc5632..a380214f80 100644 --- a/salt/modules/boto_secgroup.py +++ b/salt/modules/boto_secgroup.py @@ -38,15 +38,17 @@ from __future__ import absolute_import # Import Python libs import logging import re -from distutils.version import LooseVersion as _LooseVersion +from distutils.version import LooseVersion as _LooseVersion # pylint: disable=import-error,no-name-in-module import salt.ext.six as six log = logging.getLogger(__name__) # Import third party libs try: + # pylint: disable=import-error import boto import boto.ec2 + # pylint: enable=import-error logging.getLogger('boto').setLevel(logging.CRITICAL) HAS_BOTO = True except ImportError: From 6b7af5dfc7d6fd1e213107cb91b76da04f4b0261 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:27:41 +0000 Subject: [PATCH 086/115] Disable some Pylint errors --- salt/modules/boto_vpc.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/salt/modules/boto_vpc.py b/salt/modules/boto_vpc.py index 437cb68ff8..99d2a93aca 100644 --- a/salt/modules/boto_vpc.py +++ b/salt/modules/boto_vpc.py @@ -38,16 +38,17 @@ from __future__ import absolute_import # Import Python libs import logging -from distutils.version import LooseVersion as _LooseVersion +from distutils.version import LooseVersion as _LooseVersion # pylint: disable=import-error,no-name-in-module from salt.exceptions import SaltInvocationError, CommandExecutionError log = logging.getLogger(__name__) # Import third party libs try: + # pylint: disable=import-error import boto import boto.vpc - + # pylint: disable=import-error logging.getLogger('boto').setLevel(logging.CRITICAL) HAS_BOTO = True except ImportError: From db9541f2d52f2bdfce5ffb3b60dc32325f983c53 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:28:11 +0000 Subject: [PATCH 087/115] Disable some Pylint errors --- salt/modules/chocolatey.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/chocolatey.py b/salt/modules/chocolatey.py index d19caccf0f..e54534b18d 100644 --- a/salt/modules/chocolatey.py +++ b/salt/modules/chocolatey.py @@ -12,7 +12,7 @@ import logging import os.path import re import tempfile -from distutils.version import LooseVersion as _LooseVersion +from distutils.version import LooseVersion as _LooseVersion # pylint: disable=import-error,no-name-in-module # Import salt libs import salt.utils From 8319680fff8e8a21625d9c1358ea83bf3e922575 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:28:36 +0000 Subject: [PATCH 088/115] Disable some Pylint errors --- salt/modules/gpg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/gpg.py b/salt/modules/gpg.py index 860c533278..48146b1555 100644 --- a/salt/modules/gpg.py +++ b/salt/modules/gpg.py @@ -12,7 +12,7 @@ from keyservers. Sign, encrypt and sign & encrypt text and files. from __future__ import absolute_import # Import python libs -import distutils.version +import distutils.version # pylint: disable=import-error,no-name-in-module import logging import re import time From 761ba6c68c65ffe2b22cc30961041980907b4e54 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:29:38 +0000 Subject: [PATCH 089/115] Disable some Pylint errors --- salt/returners/xmpp_return.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/salt/returners/xmpp_return.py b/salt/returners/xmpp_return.py index 4585ae50ee..f86d032c07 100644 --- a/salt/returners/xmpp_return.py +++ b/salt/returners/xmpp_return.py @@ -55,7 +55,7 @@ XMPP settings may also be configured as:: from __future__ import absolute_import # Import python libs -import distutils.version +import distutils.version # pylint: disable=import-error,no-name-in-module import logging import pprint @@ -63,7 +63,7 @@ import salt.returners HAS_LIBS = False try: - from sleekxmpp import ClientXMPP as _ClientXMPP + from sleekxmpp import ClientXMPP as _ClientXMPP # pylint: disable=import-error HAS_LIBS = True except ImportError: class _ClientXMPP(object): From 14cc8931eddcbc05bc0516c8d02813669273388b Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:30:05 +0000 Subject: [PATCH 090/115] Disable some Pylint errors --- tests/integration/modules/pillar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/modules/pillar.py b/tests/integration/modules/pillar.py index 35f2e72cfe..4b04bbf6d3 100644 --- a/tests/integration/modules/pillar.py +++ b/tests/integration/modules/pillar.py @@ -3,7 +3,7 @@ from __future__ import absolute_import # Import Python Libs -from distutils.version import LooseVersion +from distutils.version import LooseVersion # pylint: disable=import-error,no-name-in-module # Import Salt Testing libs from salttesting import skipIf From 8a1cc589a15a49607ccb554a26c592f43c3f3fd3 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:31:01 +0000 Subject: [PATCH 091/115] Disable some Pylint errors --- tests/unit/modules/boto_secgroup_test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/unit/modules/boto_secgroup_test.py b/tests/unit/modules/boto_secgroup_test.py index 63a79f073c..606beab19b 100644 --- a/tests/unit/modules/boto_secgroup_test.py +++ b/tests/unit/modules/boto_secgroup_test.py @@ -4,9 +4,10 @@ import random import string from copy import deepcopy -from distutils.version import LooseVersion +from distutils.version import LooseVersion # pylint: disable=import-error,no-name-in-module # import Python Third Party Libs +# pylint: disable=import-error try: import boto HAS_BOTO = True @@ -29,6 +30,7 @@ except ImportError: def stub_function(self): pass return stub_function +# pylint: disable=import-error # Import Salt Libs from salt.utils.odict import OrderedDict From b07707ff9627c456cbdc96140cdcdde64e210a50 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:31:55 +0000 Subject: [PATCH 092/115] Disable some Pylint errors --- tests/unit/modules/boto_vpc_test.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/unit/modules/boto_vpc_test.py b/tests/unit/modules/boto_vpc_test.py index 07c6fea21b..1fcb94fb00 100644 --- a/tests/unit/modules/boto_vpc_test.py +++ b/tests/unit/modules/boto_vpc_test.py @@ -7,7 +7,7 @@ from mock import patch from salt.exceptions import SaltInvocationError, CommandExecutionError from salt.modules.boto_vpc import _maybe_set_name_tag, _maybe_set_tags - +# pylint: disable=import-error,no-name-in-module try: import boto from boto.exception import BotoServerError @@ -37,7 +37,8 @@ except ImportError: return stub_function # Import Python libs -from distutils.version import LooseVersion +from distutils.version import LooseVersion # pylint: disable=no-name-in-module +# pylint: disable=import-error # Import Salt Libs from salt.modules import boto_vpc From 9d6c855e1afed646c71386cca4f70030bf444a79 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:33:45 +0000 Subject: [PATCH 093/115] Disable some Pylint errors --- tests/unit/modules/zcbuildout_test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit/modules/zcbuildout_test.py b/tests/unit/modules/zcbuildout_test.py index 93f41b24e2..56a15c498c 100644 --- a/tests/unit/modules/zcbuildout_test.py +++ b/tests/unit/modules/zcbuildout_test.py @@ -140,6 +140,7 @@ class BuildoutTestCase(Base): def callback2(a, b=1): raise Exception('foo') + # pylint: disable=invalid-sequence-index ret1 = callback1(1, b=3) self.assertEqual(ret1['status'], True) self.assertEqual(ret1['logs_by_level']['warn'], ['wbar']) @@ -173,6 +174,7 @@ class BuildoutTestCase(Base): self.assertEqual(ret2['out'], None) for l in buildout.LOG.levels: self.assertTrue(0 == len(buildout.LOG.by_level[l])) + # pylint: enable=invalid-sequence-index @requires_network() def test_get_bootstrap_url(self): From 1dbcae31b97d7fecaec92de5370a42c4226efdd2 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:50:40 +0000 Subject: [PATCH 094/115] Ignore the locally enabled/disabled pylint checks --- .pylintrc | 6 +++++- .testing.pylintrc | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index 94a90d4e96..5b0da8afcd 100644 --- a/.pylintrc +++ b/.pylintrc @@ -42,7 +42,9 @@ load-plugins=salttesting.pylintplugins.pep8,salttesting.pylintplugins.pep263,sal # multiple time (only on the command line, not in the configuration file where # it should appear only once). disable=W0142, - C0330 + C0330, + I0011, + I0012 # E8121, # E8122, # E8123, @@ -58,6 +60,8 @@ disable=W0142, # E812* All PEP8 E12* # E8501 PEP8 line too long # C0330 (bad-continuation) +# I0011 (locally-disabling) +# I0012 (locally-enabling) [REPORTS] diff --git a/.testing.pylintrc b/.testing.pylintrc index 0a03ce1848..b441310a50 100644 --- a/.testing.pylintrc +++ b/.testing.pylintrc @@ -34,6 +34,7 @@ load-plugins=salttesting.pylintplugins.pep8,salttesting.pylintplugins.pep263,sal # --disable=W" disable=R, I0011, + I0012, I0013, E1101, E1103, @@ -77,6 +78,7 @@ disable=R, # Disabled: # R* [refactoring suggestions & reports] # I0011 (locally-disabling) +# I0012 (locally-enabling) # I0013 (file-ignored) # E1101 (no-member) [pylint isn't smart enough] # E1103 (maybe-no-member) From 55dac6f73cc3f1fbe1aa6897ff9ebd5c3e3bcceb Mon Sep 17 00:00:00 2001 From: Erik Johnson Date: Fri, 28 Nov 2014 10:57:41 -0600 Subject: [PATCH 095/115] Fix yum pkg holding when doing version pinning with "pkgs" arg Resolves #18468 --- salt/modules/yumpkg.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py index 037dbbfde0..f9bc9c0c9d 100644 --- a/salt/modules/yumpkg.py +++ b/salt/modules/yumpkg.py @@ -1160,7 +1160,7 @@ def hold(name=None, pkgs=None, sources=None, **kwargs): # pylint: disable=W0613 targets = [] if pkgs: - for pkg in pkgs: + for pkg in salt.utils.repack_dictlist(pkgs): ret = check_db(pkg) if not ret[pkg]['found']: raise SaltInvocationError( @@ -1253,7 +1253,8 @@ def unhold(name=None, pkgs=None, sources=None, **kwargs): # pylint: disable=W06 targets = [] if pkgs: - targets.extend(pkgs) + for pkg in salt.utils.repack_dictlist(pkgs): + targets.append(pkg) elif sources: for source in sources: targets.append(next(iter(source))) From b11542dab9a5be369101163ea887341ffe3bdd5b Mon Sep 17 00:00:00 2001 From: Erik Johnson Date: Fri, 28 Nov 2014 16:55:49 -0600 Subject: [PATCH 096/115] Update 2014.7.1 release notes --- doc/topics/releases/2014.7.1.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/topics/releases/2014.7.1.rst b/doc/topics/releases/2014.7.1.rst index d6f4944f88..06e330a620 100644 --- a/doc/topics/releases/2014.7.1.rst +++ b/doc/topics/releases/2014.7.1.rst @@ -7,5 +7,7 @@ Salt 2014.7.1 Release Notes Version 2014.7.1 is a bugfix release for :doc:`2014.7.0 `. The changes include: -- Fix gitfs serving of symlinked files (:issue:`17700`) - +- Fixed gitfs serving symlinks in :mod:`file.recurse + ` states (:issue:`17700`) +- Fix holding of multiple packages (YUM) when combined with version pinning + (:issue:`18468`) From 6a7662c4980a80e5fafb44f44471e16f39c143ec Mon Sep 17 00:00:00 2001 From: Elias Probst Date: Sat, 29 Nov 2014 15:58:07 +0100 Subject: [PATCH 097/115] =?UTF-8?q?Fix=20typo=20(agregate=20=E2=86=92=20ag?= =?UTF-8?q?gregate).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/ref/states/aggregate.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ref/states/aggregate.rst b/doc/ref/states/aggregate.rst index 37d1acac4c..285e9391c4 100644 --- a/doc/ref/states/aggregate.rst +++ b/doc/ref/states/aggregate.rst @@ -16,7 +16,7 @@ How it Works The best example is the `pkg` state. One of the major requests in Salt has long been adding the ability to install all packages defined at the same time. The mod_aggregate system makes this a reality. While executing Salt's state system, -when a `pkg` state is reached the ``mod_agregate`` function in the state module +when a `pkg` state is reached the ``mod_aggregate`` function in the state module is called. For `pkg` this function scans all of the other states that are slated to run, and picks up the references to ``name`` and ``pkgs``, then adds them to ``pkgs`` in the first state. The result is calling yum/apt-get/pacman etc. just From f5de037d9676788d7d88a37d703d5f937737dd76 Mon Sep 17 00:00:00 2001 From: "Gareth J. Greenaway" Date: Sat, 29 Nov 2014 10:59:06 -0800 Subject: [PATCH 098/115] Fixing a bug in the scheduler that caused a runaway job and CPU spikes when using the 'when' paramter. Also some cleanup of redundant calls to time.time and the comparison used to see when a job should run. --- salt/utils/schedule.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/salt/utils/schedule.py b/salt/utils/schedule.py index 601a733f02..a796d682a8 100644 --- a/salt/utils/schedule.py +++ b/salt/utils/schedule.py @@ -495,8 +495,9 @@ class Schedule(object): when = 0 seconds = 0 cron = 0 - + now = int(time.time()) time_conflict = False + for item in ['seconds', 'minutes', 'hours', 'days']: if item in data and 'when' in data: time_conflict = True @@ -526,7 +527,6 @@ class Schedule(object): if isinstance(data['when'], list): _when = [] - now = int(time.time()) for i in data['when']: try: tmp = int(dateutil_parser.parse(i).strftime('%s')) @@ -546,7 +546,7 @@ class Schedule(object): if '_when' in data and data['_when'] != when: data['_when_run'] = True data['_when'] = when - seconds = when - int(time.time()) + seconds = when - now # scheduled time is in the past if seconds < 0: @@ -574,7 +574,6 @@ class Schedule(object): log.error('Invalid date string. Ignoring') continue - now = int(time.time()) seconds = when - now # scheduled time is in the past @@ -612,14 +611,16 @@ class Schedule(object): # loop interval needed. If it is lower then overwrite variable # external loops using can then check this variable for how often # they need to reschedule themselves - if seconds < self.loop_interval: - self.loop_interval = seconds - now = int(time.time()) + # Not used with 'when' parameter, causes run away jobs and CPU + # spikes. + if 'when' not in data: + if seconds < self.loop_interval: + self.loop_interval = seconds run = False if job in self.intervals: if 'when' in data: - if now - when >= seconds: + if seconds == 0: if data['_when_run']: data['_when_run'] = False run = True @@ -643,7 +644,7 @@ class Schedule(object): data['_seconds'] = 0 if 'when' in data: - if now - when >= seconds: + if seconds == 0: if data['_when_run']: data['_when_run'] = False run = True @@ -739,7 +740,7 @@ class Schedule(object): if self.opts.get('multiprocessing', True): proc.join() finally: - self.intervals[job] = int(time.time()) + self.intervals[job] = now def clean_proc_dir(opts): From d7a4fdede27f2538662afc1b0c0779a6ffd83e84 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:26:47 +0000 Subject: [PATCH 099/115] Disable some Pylint errors --- salt/modules/boto_secgroup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/salt/modules/boto_secgroup.py b/salt/modules/boto_secgroup.py index 48f140a212..8879675da6 100644 --- a/salt/modules/boto_secgroup.py +++ b/salt/modules/boto_secgroup.py @@ -37,14 +37,16 @@ Connection module for Amazon Security Groups # Import Python libs import logging import re -from distutils.version import LooseVersion as _LooseVersion +from distutils.version import LooseVersion as _LooseVersion # pylint: disable=import-error,no-name-in-module log = logging.getLogger(__name__) # Import third party libs try: + # pylint: disable=import-error import boto import boto.ec2 + # pylint: enable=import-error logging.getLogger('boto').setLevel(logging.CRITICAL) HAS_BOTO = True except ImportError: From 38b95953ef12b53dfd249b35a2d6835c5f2b4b0c Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:27:41 +0000 Subject: [PATCH 100/115] Disable some Pylint errors --- salt/modules/boto_vpc.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/salt/modules/boto_vpc.py b/salt/modules/boto_vpc.py index 401a716b59..880edbe058 100644 --- a/salt/modules/boto_vpc.py +++ b/salt/modules/boto_vpc.py @@ -37,14 +37,16 @@ Connection module for Amazon VPC # Import Python libs import logging -from distutils.version import LooseVersion as _LooseVersion +from distutils.version import LooseVersion as _LooseVersion # pylint: disable=import-error,no-name-in-module log = logging.getLogger(__name__) # Import third party libs try: + # pylint: disable=import-error import boto import boto.vpc + # pylint: enable=import-error logging.getLogger('boto').setLevel(logging.CRITICAL) HAS_BOTO = True except ImportError: From 4dcb20eb62beae83211a9baaed0354b6b2c44280 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:28:11 +0000 Subject: [PATCH 101/115] Disable some Pylint errors --- salt/modules/chocolatey.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/chocolatey.py b/salt/modules/chocolatey.py index f02a846b9d..500de8385a 100644 --- a/salt/modules/chocolatey.py +++ b/salt/modules/chocolatey.py @@ -11,7 +11,7 @@ import logging import os.path import re import tempfile -from distutils.version import LooseVersion as _LooseVersion +from distutils.version import LooseVersion as _LooseVersion # pylint: disable=import-error,no-name-in-module # Import salt libs import salt.utils From a985f0ac4ef31e534e96319da9980745f5169252 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:30:05 +0000 Subject: [PATCH 102/115] Disable some Pylint errors --- tests/integration/modules/pillar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/modules/pillar.py b/tests/integration/modules/pillar.py index addfa0545f..860acce921 100644 --- a/tests/integration/modules/pillar.py +++ b/tests/integration/modules/pillar.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Import Python Libs -from distutils.version import LooseVersion +from distutils.version import LooseVersion # pylint: disable=import-error,no-name-in-module # Import Salt Testing libs from salttesting import skipIf From fd9377fefecb3bf55b751738c0709dd39754ba30 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:31:01 +0000 Subject: [PATCH 103/115] Disable some Pylint errors --- tests/unit/modules/boto_secgroup_test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/unit/modules/boto_secgroup_test.py b/tests/unit/modules/boto_secgroup_test.py index 63a79f073c..606beab19b 100644 --- a/tests/unit/modules/boto_secgroup_test.py +++ b/tests/unit/modules/boto_secgroup_test.py @@ -4,9 +4,10 @@ import random import string from copy import deepcopy -from distutils.version import LooseVersion +from distutils.version import LooseVersion # pylint: disable=import-error,no-name-in-module # import Python Third Party Libs +# pylint: disable=import-error try: import boto HAS_BOTO = True @@ -29,6 +30,7 @@ except ImportError: def stub_function(self): pass return stub_function +# pylint: disable=import-error # Import Salt Libs from salt.utils.odict import OrderedDict From bdf3a3e91c4b79d33b13743698c64ad99d776d4d Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:31:55 +0000 Subject: [PATCH 104/115] Disable some Pylint errors --- tests/unit/modules/boto_vpc_test.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/unit/modules/boto_vpc_test.py b/tests/unit/modules/boto_vpc_test.py index 9677068040..2b5fd1cd20 100644 --- a/tests/unit/modules/boto_vpc_test.py +++ b/tests/unit/modules/boto_vpc_test.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- # import Python Third Party Libs +from salttesting.mock import patch + +# pylint: disable=import-error,no-name-in-module try: import boto HAS_BOTO = True @@ -25,7 +28,8 @@ except ImportError: return stub_function # Import Python libs -from distutils.version import LooseVersion +from distutils.version import LooseVersion # pylint: disable=no-name-in-module +# pylint: enable=import-error # Import Salt Libs from salt.modules import boto_vpc From be18e8b244c32b03cb2520dabcc2728288938487 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:33:45 +0000 Subject: [PATCH 105/115] Disable some Pylint errors --- tests/unit/modules/zcbuildout_test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit/modules/zcbuildout_test.py b/tests/unit/modules/zcbuildout_test.py index 7e692865fb..47a1f7f63c 100644 --- a/tests/unit/modules/zcbuildout_test.py +++ b/tests/unit/modules/zcbuildout_test.py @@ -137,6 +137,7 @@ class BuildoutTestCase(Base): def callback2(a, b=1): raise Exception('foo') + # pylint: disable=invalid-sequence-index ret1 = callback1(1, b=3) self.assertEqual(ret1['status'], True) self.assertEqual(ret1['logs_by_level']['warn'], ['wbar']) @@ -170,6 +171,7 @@ class BuildoutTestCase(Base): self.assertEqual(ret2['out'], None) for l in buildout.LOG.levels: self.assertTrue(0 == len(buildout.LOG.by_level[l])) + # pylint: enable=invalid-sequence-index @requires_network() def test_get_bootstrap_url(self): From e09750e97d627a0422cc58e81c94071cc829f1aa Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Fri, 28 Nov 2014 15:50:40 +0000 Subject: [PATCH 106/115] Ignore the locally enabled/disabled pylint checks --- .pylintrc | 6 +++++- .testing.pylintrc | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index 5714c5aa45..cf699234f2 100644 --- a/.pylintrc +++ b/.pylintrc @@ -42,7 +42,9 @@ load-plugins=salttesting.pylintplugins.pep8,salttesting.pylintplugins.pep263,sal # multiple time (only on the command line, not in the configuration file where # it should appear only once). disable=W0142, - C0330 + C0330, + I0011, + I0012 # E8121, # E8122, # E8123, @@ -58,6 +60,8 @@ disable=W0142, # E812* All PEP8 E12* # E8501 PEP8 line too long # C0330 (bad-continuation) +# I0011 (locally-disabling) +# I0012 (locally-enabling) [REPORTS] diff --git a/.testing.pylintrc b/.testing.pylintrc index c0d7ade0a2..beaba85b21 100644 --- a/.testing.pylintrc +++ b/.testing.pylintrc @@ -34,6 +34,7 @@ load-plugins=salttesting.pylintplugins.pep8,salttesting.pylintplugins.pep263,sal # --disable=W" disable=R, I0011, + I0012, I0013, E1101, E1103, @@ -77,6 +78,7 @@ disable=R, # Disabled: # R* [refactoring suggestions & reports] # I0011 (locally-disabling) +# I0012 (locally-enabling) # I0013 (file-ignored) # E1101 (no-member) [pylint isn't smart enough] # E1103 (maybe-no-member) From 3760915099c866ae22ae3c3485d180323698e9fc Mon Sep 17 00:00:00 2001 From: rallytime Date: Mon, 1 Dec 2014 13:43:57 -0700 Subject: [PATCH 107/115] Skip test_max_open_files test until we can find the real problem --- tests/unit/utils/verify_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/unit/utils/verify_test.py b/tests/unit/utils/verify_test.py index 6e62359b82..6d16cbf8aa 100644 --- a/tests/unit/utils/verify_test.py +++ b/tests/unit/utils/verify_test.py @@ -109,8 +109,7 @@ class TestVerify(TestCase): # not support IPv6. pass - @skipIf(os.environ.get('TRAVIS_PYTHON_VERSION', None) is not None, - 'Travis environment does not like too many open files') + @skipIf(True, 'Skipping until we can find why Jenkins is bailing out') def test_max_open_files(self): with TestsLoggingHandler() as handler: From 39fb37289836d5d5861b1443b2585bd19c259349 Mon Sep 17 00:00:00 2001 From: Tim O'Guin Date: Mon, 1 Dec 2014 14:46:32 -0600 Subject: [PATCH 108/115] fixed allocate_new_eip typo in AWS cloud docs --- doc/topics/cloud/aws.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/topics/cloud/aws.rst b/doc/topics/cloud/aws.rst index 7d2d826434..03f2e7f4c4 100644 --- a/doc/topics/cloud/aws.rst +++ b/doc/topics/cloud/aws.rst @@ -922,7 +922,7 @@ the network interfaces of your virtual machines, for example:- # interface (will be associated with the primary private ip address # of the interface # - # allocation_new_eip: True + # allocate_new_eip: True # Uncomment this instead to allocate a new Elastic IP Address to # both the primary private ip address and each of the secondary ones From 749c4f58e6b9581a73dce0e7be2a8515ccb59792 Mon Sep 17 00:00:00 2001 From: Colton Myers Date: Mon, 1 Dec 2014 15:07:19 -0700 Subject: [PATCH 109/115] Bad merge conflict resolve runner.py --- salt/runner.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/salt/runner.py b/salt/runner.py index c5fa3143bb..e516caa226 100644 --- a/salt/runner.py +++ b/salt/runner.py @@ -49,6 +49,8 @@ class RunnerClient(mixins.SyncClientMixin, mixins.AsyncClientMixin, object): def __init__(self, opts): self.opts = opts self.functions = salt.loader.runner(opts) # Must be self.functions for mixin to work correctly :-/ + self.returners = salt.loader.returners(opts, self.functions) + self.outputters = salt.loader.outputters(opts) self.event = salt.utils.event.get_event('master', self.opts['sock_dir'], self.opts['transport']) def cmd(self, fun, arg, pub_data=None, kwarg=None): From 6530a7911e77e4a4c31a27fd16e3d6d942863b6d Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Tue, 2 Dec 2014 01:06:56 +0000 Subject: [PATCH 110/115] Disable the false import error --- tests/unit/modules/boto_vpc_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/modules/boto_vpc_test.py b/tests/unit/modules/boto_vpc_test.py index 2b5fd1cd20..2e8e6c271d 100644 --- a/tests/unit/modules/boto_vpc_test.py +++ b/tests/unit/modules/boto_vpc_test.py @@ -130,5 +130,5 @@ class BotoVpcTestCase(TestCase): if __name__ == '__main__': - from integration import run_tests + from integration import run_tests # pylint: disable=import-error run_tests(BotoVpcTestCase, needs_daemon=False) From 07ad4435a111af3848bfc9a06dc5d1288aab65a2 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Tue, 2 Dec 2014 01:14:00 +0000 Subject: [PATCH 111/115] Don't assume the `PATH` env var is exists. --- salt/modules/syslog_ng.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/salt/modules/syslog_ng.py b/salt/modules/syslog_ng.py index ec80cbf0ec..57b7ef3436 100644 --- a/salt/modules/syslog_ng.py +++ b/salt/modules/syslog_ng.py @@ -25,8 +25,7 @@ configuration file. ''' -from __future__ import generators, with_statement -from __future__ import absolute_import +from __future__ import absolute_import, generators, with_statement import time import logging @@ -780,7 +779,7 @@ def _add_to_path_envvar(directory): Adds directory to the PATH environment variable and returns the original one. ''' - orig_path = os.environ["PATH"] + orig_path = os.environ.get('PATH', '') if directory: if not os.path.isdir(directory): log.error("The given parameter is not a directory") From 4d759b90ddcc3cd283463d1b76a087e2b3a0e1d0 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Tue, 2 Dec 2014 01:15:37 +0000 Subject: [PATCH 112/115] Don't assume the `PATH` env var is set --- salt/grains/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/grains/core.py b/salt/grains/core.py index 74e3a2b4ca..418709372f 100644 --- a/salt/grains/core.py +++ b/salt/grains/core.py @@ -1410,7 +1410,7 @@ def path(): ''' # Provides: # path - return {'path': os.environ['PATH'].strip()} + return {'path': os.environ.get('PATH', '').strip()} def pythonversion(): From 74110d845fef94e3152321191bdb17e02fd176d4 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Tue, 2 Dec 2014 01:15:37 +0000 Subject: [PATCH 113/115] Don't assume the `PATH` env var is set --- salt/grains/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/grains/core.py b/salt/grains/core.py index ac845522c5..388f3ad820 100644 --- a/salt/grains/core.py +++ b/salt/grains/core.py @@ -1317,7 +1317,7 @@ def path(): ''' # Provides: # path - return {'path': os.environ['PATH'].strip()} + return {'path': os.environ.get('PATH', '').strip()} def pythonversion(): From 2396568dd540999dbc8f1e1e1915eb4e6a14d2e1 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Tue, 2 Dec 2014 01:36:49 +0000 Subject: [PATCH 114/115] Remove unused import --- tests/unit/modules/boto_vpc_test.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/unit/modules/boto_vpc_test.py b/tests/unit/modules/boto_vpc_test.py index 2e8e6c271d..88c7483479 100644 --- a/tests/unit/modules/boto_vpc_test.py +++ b/tests/unit/modules/boto_vpc_test.py @@ -1,8 +1,6 @@ # -*- coding: utf-8 -*- -# import Python Third Party Libs -from salttesting.mock import patch - +# import Third Party Libs # pylint: disable=import-error,no-name-in-module try: import boto From 83153354c4891aa793052bd0ccb0c7a791374f14 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Tue, 2 Dec 2014 01:37:42 +0000 Subject: [PATCH 115/115] Remove PyLint disable rule in 2014.7 Since it's unlikely we upgrade PyLint in this branch --- tests/unit/modules/zcbuildout_test.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/unit/modules/zcbuildout_test.py b/tests/unit/modules/zcbuildout_test.py index 47a1f7f63c..7e692865fb 100644 --- a/tests/unit/modules/zcbuildout_test.py +++ b/tests/unit/modules/zcbuildout_test.py @@ -137,7 +137,6 @@ class BuildoutTestCase(Base): def callback2(a, b=1): raise Exception('foo') - # pylint: disable=invalid-sequence-index ret1 = callback1(1, b=3) self.assertEqual(ret1['status'], True) self.assertEqual(ret1['logs_by_level']['warn'], ['wbar']) @@ -171,7 +170,6 @@ class BuildoutTestCase(Base): self.assertEqual(ret2['out'], None) for l in buildout.LOG.levels: self.assertTrue(0 == len(buildout.LOG.by_level[l])) - # pylint: enable=invalid-sequence-index @requires_network() def test_get_bootstrap_url(self):