diff options
author | Ben Brown <ben.brown@codethink.co.uk> | 2017-07-07 14:05:33 +0000 |
---|---|---|
committer | Ben Brown <ben.brown@codethink.co.uk> | 2017-07-07 14:05:33 +0000 |
commit | b5c9f1b909bf5f1d7445ab084c85676c1641d69e (patch) | |
tree | bb9d037feaf9bbaac0ba6abc02fed41812aa0775 | |
parent | 1e495f790e34817fd7d0bb9e3ffbacc8a62fae80 (diff) | |
parent | 3b5d26e511c5411a99397865f779e67e6b24f8d7 (diff) | |
download | ybd-b5c9f1b909bf5f1d7445ab084c85676c1641d69e.tar.gz |
Merge branch 'benbrown/prebuilt-rpms' into 'master'
Allow the deployment of prebuilt rpms
See merge request !369
-rwxr-xr-x | ybd/__main__.py | 7 | ||||
-rw-r--r-- | ybd/rpm.py | 48 |
2 files changed, 45 insertions, 10 deletions
diff --git a/ybd/__main__.py b/ybd/__main__.py index 4e47f38..071ea44 100755 --- a/ybd/__main__.py +++ b/ybd/__main__.py @@ -133,16 +133,17 @@ with timer('TOTAL'): if not isinstance(whitelist, list): whitelist = None - if target['kind'] in ('system', 'stratum', 'chunk'): + kind = target.get('kind', 'chunk') + if kind in ('system', 'stratum', 'chunk'): package_rpms(target, whitelist) - elif target['kind'] == 'cluster': + elif kind == 'cluster': # call package_rpms for each system in the cluster for system in target['systems']: package_rpms(system['path'], whitelist) else: log('RPM', ('%s is a %s, cannot package rpms!' - % (target['name'], target['kind']))) + % (target['name'], kind))) if config.get('reproduce'): log('REPRODUCED', @@ -1,6 +1,7 @@ import os import re import sys +from glob import glob from collections import Mapping from cache import cache_key, get_cache, md5 from app import log, timer @@ -239,21 +240,28 @@ def extract_defines(dn): return ''.join(strings) -def get_generated_package_names(system, dn): +def get_package_names_with_fields(system, dn, fields): # Ignores subpackages without files sections as those aren't generated. if 'rpm-metadata' not in dn: app.log(dn, "Tried to get package names for definition " "without rpm-metadata!") sys.exit(1) if 'packages' not in dn['rpm-metadata']: - app.log(dn, "Tried to get pacakge names for definition " + app.log(dn, "Tried to get package names for definition " "with no packages in rpm-metadata!") sys.exit(1) - package_names = [] - for package in dn['rpm-metadata']['packages']: - if 'files' in package: - package_names.append(expand_macro(system, dn, package['name'])) - return package_names + if any(all(key in package for key in ('path', 'files')) + for package in dn['rpm-metadata']['packages']): + app.log(dn, "ERROR: Cannot mix 'path' (prebuilts) and 'files' " + "(generated) in rpm-metadata") + sys.exit(1) + return {expand_macro(system, dn, package['name']) + for package in dn['rpm-metadata']['packages'] + if any(field in package for field in fields)} + + +def get_generated_package_names(system, dn): + return get_package_names_with_fields(system, dn, ['files', 'path']) def get_remote_rpm(dn, pkgfilename): @@ -305,6 +313,23 @@ def all_rpms_cached(system, dn): return True +def stage_prebuilts(dn, system): + for package in dn['rpm-metadata']['packages']: + if 'path' not in package: + continue + basedir = os.path.join(dn['sandbox'], '%s.inst' % dn['name']) + cache_path = os.path.join( + dn['sandbox'], 'RPMS', '%s.rpm' % package['name']) + rpm_glob = glob(os.path.join(basedir, package['path'].lstrip('/'))) + if not rpm_glob: + log(dn, 'Failed to find prebuilt rpm matching', package['path']) + sys.exit(1) + if len(rpm_glob) > 1: + log(dn, 'WARNING: glob pattern %s matches multiple paths' % + package['path']) + os.rename(rpm_glob[0], cache_path) + + def compose_rpm(dn, userdata): # a chunk lacking in rpm-metadata is not an error. # It means this should be skipped without doing anything. @@ -388,6 +413,8 @@ def package_one_rpm(dn, userdata): # we don't package the metadata shutil.move(baserockdir, metadir) + stage_prebuilts(dn, system) + # Generate the specfile in the metadir, note that we use # the metadata for the given package from the system metadata # directory, not the metadata for the specific chunk artifact @@ -399,6 +426,12 @@ def package_one_rpm(dn, userdata): specfile = os.path.join(metadir, '%s.spec' % name) success = True + if not any(to_build for to_build + in dn['rpm-metadata']['packages'] + if 'files' in to_build): + log(dn, 'WARNING: Nothing to package in %s, skipping' % name) + return success + if generate_spec(dn, fulldir, metafile, specfile, name, system): defines = extract_defines(dn) @@ -481,6 +514,7 @@ def deploy_rpm(dn, userdata): if not os.path.exists(dstdir): os.makedirs(dstdir) shutil.copyfile(cached_path, dstpath) + app.log(dn, "Copied %s to deployment area" % dstfilename) return True |