X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=conf_files.py;h=72a0e0013bbe882e6c7530ed0cba55af3897ca84;hb=24f4b417fd6812f02ab0e88a43bce430b3913baa;hp=51a5b17a83d1c4098a724a98b3a8e1a998d71dd5;hpb=3184dfd75f761d5a81408ead335ddbdd2346a375;p=nodemanager.git diff --git a/conf_files.py b/conf_files.py index 51a5b17..72a0e00 100755 --- a/conf_files.py +++ b/conf_files.py @@ -6,9 +6,10 @@ update local configuration files from PLC """ -import grp import os +import time import pwd +import grp from hashlib import sha1 as sha import xmlrpc.client @@ -20,7 +21,7 @@ from config import Config # right after net priority = 2 -class conf_files: +class ConfFiles: def __init__(self, noscripts=False): self.config = Config() self.noscripts = noscripts @@ -29,7 +30,7 @@ class conf_files: def checksum(self, path): try: with open(path) as feed: - return sha(feed.read()).digest() + return sha(feed.read().encode()).digest() except IOError: return None @@ -85,7 +86,7 @@ class conf_files: os.makedirs(os.path.dirname(dest)) except OSError: pass - tools.write_file(dest, lambda f: f.write(contents), + tools.write_file(dest, lambda f: f.write(contents.decode()), mode=mode, uidgid=(uid, gid)) if self.system(cf_rec['postinstall_cmd']): self.system(err_cmd) @@ -107,13 +108,15 @@ def start(): def GetSlivers(data, config=None, plc=None): logger.log("conf_files: Running.") - instance = conf_files() + instance = ConfFiles() instance.run_once(data) logger.log("conf_files: Done.") def main(): from argparse import ArgumentParser + from plcapi import PLCAPI + parser = ArgumentParser() parser.add_argument('-f', '--config', action='store', dest='config', default='/etc/planetlab/plc_config', @@ -124,6 +127,11 @@ def main(): parser.add_argument('--noscripts', action='store_true', dest='noscripts', default=False, help='Do not run pre- or post-install scripts') + parser.add_argument('--max-attempts', action='store', dest='max_attempts', + default=10, + help='Max number of attempts') + parser.add_argument('--period', action='store', dest='period', + help='Time in seconds to wait between attempts') args = parser.parse_args() # Load /etc/planetlab/plc_config @@ -136,13 +144,28 @@ def main(): else: session = args.session - # Initialize XML-RPC client - from plcapi import PLCAPI - plc = PLCAPI(config.plc_api_uri, config.cacert, auth=session) - data = plc.GetSlivers() + # loop until it succeeds once + # this is a change that comes with python3/fedora29 in late 2018, + # because although the conf_files service is defined to systemd + # as a dependency of the network, it triggers too early + # at a point where eth0 is not ready - instance = conf_files(args.noscripts) - instance.run_once(data) + # Initialize XML-RPC client + attempts = 0 + while True: + try: + plc = PLCAPI(config.plc_api_uri, config.cacert, auth=session) + data = plc.GetSlivers() + instance = ConfFiles(args.noscripts) + instance.run_once(data) + return 0 + except Exception as exc: + logger.log_exc("Could not receive GetSlivers() from PLC") + attempts += 1 + if attempts >= args.max_attempts: + return 1 + logger.log("Waiting for {}s before trying again".format(args.period)) + time.sleep(args.period) if __name__ == '__main__':