summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Brown <ben.brown@codethink.co.uk>2017-07-07 14:05:33 +0000
committerBen Brown <ben.brown@codethink.co.uk>2017-07-07 14:05:33 +0000
commitb5c9f1b909bf5f1d7445ab084c85676c1641d69e (patch)
treebb9d037feaf9bbaac0ba6abc02fed41812aa0775
parent1e495f790e34817fd7d0bb9e3ffbacc8a62fae80 (diff)
parent3b5d26e511c5411a99397865f779e67e6b24f8d7 (diff)
downloadybd-b5c9f1b909bf5f1d7445ab084c85676c1641d69e.tar.gz
Merge branch 'benbrown/prebuilt-rpms' into 'master'
Allow the deployment of prebuilt rpms See merge request !369
-rwxr-xr-xybd/__main__.py7
-rw-r--r--ybd/rpm.py48
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',
diff --git a/ybd/rpm.py b/ybd/rpm.py
index 4f8856b..0bc3a21 100644
--- a/ybd/rpm.py
+++ b/ybd/rpm.py
@@ -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