From e7e2d84bec0d404057bce203f9c90231360e88ee Mon Sep 17 00:00:00 2001 From: Alexandru Avadanii Date: Tue, 31 May 2016 22:34:54 +0200 Subject: Rebase: deploy related patch series. After change "common.py: catch stderr in exec_cmd" [1] and other unrelated changes were merged upstream, we need to rebase the complete deploy related series. While we're at it, re-export Fuel@OPNFV patches in Armband. [1] https://gerrit.opnfv.org/gerrit/#/c/14561/ Change-Id: Icbc8261c2e24e4b29e8f5f2bc83db6829219129a --- ...llow-specifying-number-of-attempts-in-exe.patch | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 patches/opnfv-fuel/0001-common.py-allow-specifying-number-of-attempts-in-exe.patch (limited to 'patches/opnfv-fuel/0001-common.py-allow-specifying-number-of-attempts-in-exe.patch') diff --git a/patches/opnfv-fuel/0001-common.py-allow-specifying-number-of-attempts-in-exe.patch b/patches/opnfv-fuel/0001-common.py-allow-specifying-number-of-attempts-in-exe.patch new file mode 100644 index 00000000..b3cd2dc9 --- /dev/null +++ b/patches/opnfv-fuel/0001-common.py-allow-specifying-number-of-attempts-in-exe.patch @@ -0,0 +1,70 @@ +From: Josep Puigdemont +Date: Fri, 6 May 2016 03:28:26 +0200 +Subject: [PATCH] common.py: allow specifying number of attempts in exec_cmd + +Some commands executed by exec_cmd may fail because of a temporary +cause, and it may be desirable to retry the same command several times +until it succeeds. One example of this are the ipmitool commands, which +may fail temorarily on some targets if they get too many requests +simultaneously. + +In this patch three new optional parameters are introduced to the +function signature, which do not break backward compatibility: + attempts: which indicates how many times the command should be run if + it returns a non-zero value*, and defaults to 1 (as today). + delay: which indicates the delay in seconds between attempts, and + defaults to 5 seconds. + verbose: It will print the remaining attempts left for the current + command if set to True. + +* It may be desirable to add yet another parameter to indicate what + return value should be considered an error, but non-zero for now + seems a reasonable default. + +Signed-off-by: Josep Puigdemont +--- + deploy/common.py | 24 +++++++++++++++++------- + 1 file changed, 17 insertions(+), 7 deletions(-) + +diff --git a/deploy/common.py b/deploy/common.py +index 41b4e27..3cd3e0e 100644 +--- a/deploy/common.py ++++ b/deploy/common.py +@@ -16,6 +16,7 @@ import argparse + import shutil + import stat + import errno ++import time + + N = {'id': 0, 'status': 1, 'name': 2, 'cluster': 3, 'ip': 4, 'mac': 5, + 'roles': 6, 'pending_roles': 7, 'online': 8, 'group_id': 9} +@@ -37,13 +38,22 @@ out_handler.setFormatter(formatter) + LOG.addHandler(out_handler) + os.chmod(LOGFILE, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) + +-def exec_cmd(cmd, check=True): +- process = subprocess.Popen(cmd, +- stdout=subprocess.PIPE, +- stderr=subprocess.PIPE, +- shell=True) +- (response, stderr) = process.communicate() +- return_code = process.returncode ++def exec_cmd(cmd, check=True, attempts=1, delay=5, verbose=False): ++ # a negative value means forever ++ while attempts != 0: ++ attempts = attempts - 1 ++ process = subprocess.Popen(cmd, ++ stdout=subprocess.PIPE, ++ stderr=subprocess.PIPE, ++ shell=True) ++ (response, stderr) = process.communicate() ++ return_code = process.returncode ++ if return_code == 0 or attempts == 0: ++ break ++ time.sleep(delay) ++ if verbose: ++ log('%d attempts left: %s' % (attempts, cmd)) ++ + response = response.strip() + if check: + if return_code > 0: -- cgit 1.2.3-korg