|
Packit Service |
11b429 |
#!/usr/bin/env python
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
import argparse
|
|
Packit Service |
a04d08 |
import glob
|
|
Packit Service |
a04d08 |
import json
|
|
Packit Service |
a04d08 |
import os
|
|
Packit Service |
a04d08 |
import shutil
|
|
Packit Service |
a04d08 |
import sys
|
|
Packit Service |
a04d08 |
import tempfile
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def find_root():
|
|
Packit Service |
a04d08 |
# expected path is in <top_dir>/packages/
|
|
Packit Service |
a04d08 |
top_dir = os.environ.get("CLOUD_INIT_TOP_D", None)
|
|
Packit Service |
a04d08 |
if top_dir is None:
|
|
Packit Service |
a04d08 |
top_dir = os.path.dirname(
|
|
Packit Service |
a04d08 |
os.path.dirname(os.path.abspath(sys.argv[0])))
|
|
Packit Service |
a04d08 |
if os.path.isfile(os.path.join(top_dir, 'setup.py')):
|
|
Packit Service |
a04d08 |
return os.path.abspath(top_dir)
|
|
Packit Service |
a04d08 |
raise OSError(("Unable to determine where your cloud-init topdir is."
|
|
Packit Service |
a04d08 |
" set CLOUD_INIT_TOP_D?"))
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if "avoid-pep8-E402-import-not-top-of-file":
|
|
Packit Service |
a04d08 |
# Use the util functions from cloudinit
|
|
Packit Service |
a04d08 |
sys.path.insert(0, find_root())
|
|
Packit Service |
a04d08 |
from cloudinit import templater
|
|
Packit Service |
a04d08 |
from cloudinit import util
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# Subdirectories of the ~/rpmbuild dir
|
|
Packit Service |
a04d08 |
RPM_BUILD_SUBDIRS = ['BUILD', 'RPMS', 'SOURCES', 'SPECS', 'SRPMS']
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def run_helper(helper, args=None, strip=True):
|
|
Packit Service |
a04d08 |
if args is None:
|
|
Packit Service |
a04d08 |
args = []
|
|
Packit Service |
a04d08 |
cmd = [util.abs_join(find_root(), 'tools', helper)] + args
|
|
Packit Service |
11b429 |
(stdout, _stderr) = util.subp(cmd)
|
|
Packit Service |
a04d08 |
if strip:
|
|
Packit Service |
a04d08 |
stdout = stdout.strip()
|
|
Packit Service |
a04d08 |
return stdout
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
11b429 |
def read_dependencies(distro, requirements_file='requirements.txt'):
|
|
Packit Service |
a04d08 |
"""Returns the Python package depedencies from requirements.txt files.
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
11b429 |
@returns a tuple of (requirements, test_requirements)
|
|
Packit Service |
a04d08 |
"""
|
|
Packit Service |
11b429 |
pkg_deps = run_helper(
|
|
Packit Service |
11b429 |
'read-dependencies', args=['--distro', distro]).splitlines()
|
|
Packit Service |
a04d08 |
test_deps = run_helper(
|
|
Packit Service |
a04d08 |
'read-dependencies', args=[
|
|
Packit Service |
a04d08 |
'--requirements-file', 'test-requirements.txt',
|
|
Packit Service |
a04d08 |
'--system-pkg-names']).splitlines()
|
|
Packit Service |
11b429 |
return (pkg_deps, test_deps)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def read_version():
|
|
Packit Service |
a04d08 |
return json.loads(run_helper('read-version', ['--json']))
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def generate_spec_contents(args, version_data, tmpl_fn, top_dir, arc_fn):
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# Tmpl params
|
|
Packit Service |
a04d08 |
subs = {}
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if args.sub_release is not None:
|
|
Packit Service |
a04d08 |
subs['subrelease'] = str(args.sub_release)
|
|
Packit Service |
a04d08 |
else:
|
|
Packit Service |
a04d08 |
subs['subrelease'] = ""
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
subs['archive_name'] = arc_fn
|
|
Packit Service |
a04d08 |
subs['source_name'] = os.path.basename(arc_fn).replace('.tar.gz', '')
|
|
Packit Service |
a04d08 |
subs.update(version_data)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# rpm does not like '-' in the Version, so change
|
|
Packit Service |
a04d08 |
# X.Y.Z-N-gHASH to X.Y.Z+N.gHASH
|
|
Packit Service |
a04d08 |
if "-" in version_data.get('version'):
|
|
Packit Service |
a04d08 |
ver, commits, ghash = version_data['version'].split("-")
|
|
Packit Service |
a04d08 |
rpm_upstream_version = "%s+%s.%s" % (ver, commits, ghash)
|
|
Packit Service |
a04d08 |
else:
|
|
Packit Service |
a04d08 |
rpm_upstream_version = version_data['version']
|
|
Packit Service |
a04d08 |
subs['rpm_upstream_version'] = rpm_upstream_version
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
11b429 |
deps, test_deps = read_dependencies(distro=args.distro)
|
|
Packit Service |
11b429 |
subs['buildrequires'] = deps + test_deps
|
|
Packit Service |
11b429 |
subs['requires'] = deps
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if args.boot == 'sysvinit':
|
|
Packit Service |
a04d08 |
subs['sysvinit'] = True
|
|
Packit Service |
a04d08 |
else:
|
|
Packit Service |
a04d08 |
subs['sysvinit'] = False
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if args.boot == 'systemd':
|
|
Packit Service |
a04d08 |
subs['systemd'] = True
|
|
Packit Service |
a04d08 |
else:
|
|
Packit Service |
a04d08 |
subs['systemd'] = False
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
subs['init_sys'] = args.boot
|
|
Packit Service |
a04d08 |
subs['patches'] = [os.path.basename(p) for p in args.patches]
|
|
Packit Service |
a04d08 |
return templater.render_from_file(tmpl_fn, params=subs)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def main():
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
parser = argparse.ArgumentParser()
|
|
Packit Service |
a04d08 |
parser.add_argument("-d", "--distro", dest="distro",
|
|
Packit Service |
a04d08 |
help="select distro (default: %(default)s)",
|
|
Packit Service |
a04d08 |
metavar="DISTRO", default='redhat',
|
|
Packit Service |
a04d08 |
choices=('redhat', 'suse'))
|
|
Packit Service |
a04d08 |
parser.add_argument('--srpm',
|
|
Packit Service |
a04d08 |
help='Produce a source rpm',
|
|
Packit Service |
a04d08 |
action='store_true')
|
|
Packit Service |
a04d08 |
parser.add_argument("-b", "--boot", dest="boot",
|
|
Packit Service |
a04d08 |
help="select boot type (default: %(default)s)",
|
|
Packit Service |
a04d08 |
metavar="TYPE", default='sysvinit',
|
|
Packit Service |
a04d08 |
choices=('sysvinit', 'systemd'))
|
|
Packit Service |
a04d08 |
parser.add_argument("-v", "--verbose", dest="verbose",
|
|
Packit Service |
a04d08 |
help=("run verbosely"
|
|
Packit Service |
a04d08 |
" (default: %(default)s)"),
|
|
Packit Service |
a04d08 |
default=False,
|
|
Packit Service |
a04d08 |
action='store_true')
|
|
Packit Service |
a04d08 |
parser.add_argument('-s', "--sub-release", dest="sub_release",
|
|
Packit Service |
a04d08 |
metavar="RELEASE",
|
|
Packit Service |
a04d08 |
help=("a 'internal' release number to concat"
|
|
Packit Service |
a04d08 |
" with the bzr version number to form"
|
|
Packit Service |
a04d08 |
" the final version number"),
|
|
Packit Service |
a04d08 |
type=int,
|
|
Packit Service |
a04d08 |
default=None)
|
|
Packit Service |
a04d08 |
parser.add_argument("-p", "--patch", dest="patches",
|
|
Packit Service |
a04d08 |
help=("include the following patch when building"),
|
|
Packit Service |
a04d08 |
default=[],
|
|
Packit Service |
a04d08 |
action='append')
|
|
Packit Service |
a04d08 |
args = parser.parse_args()
|
|
Packit Service |
a04d08 |
capture = True
|
|
Packit Service |
a04d08 |
if args.verbose:
|
|
Packit Service |
a04d08 |
capture = False
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
workdir = None
|
|
Packit Service |
a04d08 |
try:
|
|
Packit Service |
a04d08 |
workdir = tempfile.mkdtemp(prefix='rpmbuild')
|
|
Packit Service |
a04d08 |
os.environ['HOME'] = workdir
|
|
Packit Service |
a04d08 |
topdir = os.path.join(workdir, 'rpmbuild')
|
|
Packit Service |
a04d08 |
build_dirs = [os.path.join(topdir, dir)
|
|
Packit Service |
a04d08 |
for dir in RPM_BUILD_SUBDIRS]
|
|
Packit Service |
a04d08 |
util.ensure_dirs(build_dirs)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
version_data = read_version()
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# Archive the code
|
|
Packit Service |
a04d08 |
archive_fn = "cloud-init-%s.tar.gz" % version_data['version_long']
|
|
Packit Service |
a04d08 |
real_archive_fn = os.path.join(topdir, 'SOURCES', archive_fn)
|
|
Packit Service |
a04d08 |
archive_fn = run_helper(
|
|
Packit Service |
a04d08 |
'make-tarball', ['--long', '--output=' + real_archive_fn])
|
|
Packit Service |
a04d08 |
print("Archived the code in %r" % (real_archive_fn))
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# Form the spec file to be used
|
|
Packit Service |
a04d08 |
tmpl_fn = util.abs_join(find_root(), 'packages',
|
|
Packit Service |
a04d08 |
args.distro, 'cloud-init.spec.in')
|
|
Packit Service |
a04d08 |
contents = generate_spec_contents(args, version_data, tmpl_fn, topdir,
|
|
Packit Service |
a04d08 |
os.path.basename(archive_fn))
|
|
Packit Service |
a04d08 |
spec_fn = util.abs_join(topdir, 'SPECS', 'cloud-init.spec')
|
|
Packit Service |
a04d08 |
util.write_file(spec_fn, contents)
|
|
Packit Service |
a04d08 |
print("Created spec file at %r" % (spec_fn))
|
|
Packit Service |
a04d08 |
for p in args.patches:
|
|
Packit Service |
a04d08 |
util.copy(p, util.abs_join(topdir, 'SOURCES', os.path.basename(p)))
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# Now build it!
|
|
Packit Service |
a04d08 |
print("Running 'rpmbuild' in %r" % (topdir))
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if args.srpm:
|
|
Packit Service |
a04d08 |
cmd = ['rpmbuild', '-bs', '--nodeps', spec_fn]
|
|
Packit Service |
a04d08 |
else:
|
|
Packit Service |
a04d08 |
cmd = ['rpmbuild', '-ba', spec_fn]
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
11b429 |
util.subp(cmd, capture=capture)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# Copy the items built to our local dir
|
|
Packit Service |
a04d08 |
globs = []
|
|
Packit Service |
a04d08 |
globs.extend(glob.glob("%s/*.rpm" %
|
|
Packit Service |
a04d08 |
(util.abs_join(topdir, 'RPMS', 'noarch'))))
|
|
Packit Service |
a04d08 |
globs.extend(glob.glob("%s/*.rpm" %
|
|
Packit Service |
a04d08 |
(util.abs_join(topdir, 'RPMS', 'x86_64'))))
|
|
Packit Service |
a04d08 |
globs.extend(glob.glob("%s/*.rpm" %
|
|
Packit Service |
a04d08 |
(util.abs_join(topdir, 'RPMS'))))
|
|
Packit Service |
a04d08 |
globs.extend(glob.glob("%s/*.rpm" %
|
|
Packit Service |
a04d08 |
(util.abs_join(topdir, 'SRPMS'))))
|
|
Packit Service |
a04d08 |
for rpm_fn in globs:
|
|
Packit Service |
a04d08 |
tgt_fn = util.abs_join(os.getcwd(), os.path.basename(rpm_fn))
|
|
Packit Service |
a04d08 |
shutil.move(rpm_fn, tgt_fn)
|
|
Packit Service |
a04d08 |
print("Wrote out %s package %r" % (args.distro, tgt_fn))
|
|
Packit Service |
a04d08 |
finally:
|
|
Packit Service |
a04d08 |
if workdir is not None:
|
|
Packit Service |
a04d08 |
shutil.rmtree(workdir)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
return 0
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if __name__ == '__main__':
|
|
Packit Service |
a04d08 |
sys.exit(main())
|