
saucy split cloud-utils into cloud-guest-utils and cloud-image-utils. The former is in the cloud image, the latter is not, and we actually need it for growpart which is in the former.
202 lines
7.3 KiB
Python
Executable File
202 lines
7.3 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
import os
|
|
import shutil
|
|
import sys
|
|
|
|
|
|
def find_root():
|
|
# expected path is in <top_dir>/packages/
|
|
top_dir = os.environ.get("CLOUD_INIT_TOP_D", None)
|
|
if top_dir is None:
|
|
top_dir = os.path.dirname(
|
|
os.path.dirname(os.path.abspath(sys.argv[0])))
|
|
if os.path.isfile(os.path.join(top_dir, 'setup.py')):
|
|
return os.path.abspath(top_dir)
|
|
raise OSError(("Unable to determine where your cloud-init topdir is."
|
|
" set CLOUD_INIT_TOP_D?"))
|
|
|
|
# Use the util functions from cloudinit
|
|
sys.path.insert(0, find_root())
|
|
|
|
from cloudinit import templater
|
|
from cloudinit import util
|
|
|
|
import argparse
|
|
|
|
# Package names that will showup in requires to what we can actually
|
|
# use in our debian 'control' file, this is a translation of the 'requires'
|
|
# file pypi package name to a debian/ubuntu package name.
|
|
PKG_MP = {
|
|
'argparse': 'python-argparse',
|
|
'boto': 'python-boto',
|
|
'cheetah': 'python-cheetah',
|
|
'configobj': 'python-configobj',
|
|
'jsonpatch': 'python-json-patch',
|
|
'oauth': 'python-oauth',
|
|
'prettytable': 'python-prettytable',
|
|
'pyserial': 'python-serial',
|
|
'pyyaml': 'python-yaml',
|
|
'requests': 'python-requests',
|
|
}
|
|
DEBUILD_ARGS = ["-us", "-S", "-uc", "-d"]
|
|
|
|
|
|
def write_debian_folder(root, version, revno, append_requires=[]):
|
|
deb_dir = util.abs_join(root, 'debian')
|
|
os.makedirs(deb_dir)
|
|
|
|
# Fill in the change log template
|
|
templater.render_to_file(util.abs_join(find_root(),
|
|
'packages', 'debian', 'changelog.in'),
|
|
util.abs_join(deb_dir, 'changelog'),
|
|
params={
|
|
'version': version,
|
|
'revision': revno,
|
|
})
|
|
|
|
# Write out the control file template
|
|
cmd = [util.abs_join(find_root(), 'tools', 'read-dependencies')]
|
|
(stdout, _stderr) = util.subp(cmd)
|
|
pkgs = [p.lower().strip() for p in stdout.splitlines()]
|
|
|
|
# Map to known packages
|
|
requires = append_requires
|
|
for p in pkgs:
|
|
tgt_pkg = PKG_MP.get(p)
|
|
if not tgt_pkg:
|
|
raise RuntimeError(("Do not know how to translate pypi dependency"
|
|
" %r to a known package") % (p))
|
|
else:
|
|
requires.append(tgt_pkg)
|
|
|
|
templater.render_to_file(util.abs_join(find_root(),
|
|
'packages', 'debian', 'control.in'),
|
|
util.abs_join(deb_dir, 'control'),
|
|
params={'requires': requires})
|
|
|
|
# Just copy the following directly
|
|
for base_fn in ['dirs', 'copyright', 'compat', 'pycompat', 'rules']:
|
|
shutil.copy(util.abs_join(find_root(),
|
|
'packages', 'debian', base_fn),
|
|
util.abs_join(deb_dir, base_fn))
|
|
|
|
|
|
def main():
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("-v", "--verbose", dest="verbose",
|
|
help=("run verbosely"
|
|
" (default: %(default)s)"),
|
|
default=False,
|
|
action='store_true')
|
|
parser.add_argument("--no-cloud-utils", dest="no_cloud_utils",
|
|
help=("don't depend on cloud-utils package"
|
|
" (default: %(default)s)"),
|
|
default=False,
|
|
action='store_true')
|
|
|
|
parser.add_argument("--init-system", dest="init_system",
|
|
help=("build deb with INIT_SYSTEM=xxx"
|
|
" (default: %(default)s"),
|
|
default=os.environ.get("INIT_SYSTEM", "upstart"))
|
|
|
|
|
|
for ent in DEBUILD_ARGS:
|
|
parser.add_argument(ent, dest="debuild_args", action='append_const',
|
|
const=ent, help=("pass through '%s' to debuild" % ent))
|
|
|
|
args = parser.parse_args()
|
|
|
|
os.environ['INIT_SYSTEM'] = args.init_system
|
|
|
|
capture = True
|
|
if args.verbose:
|
|
capture = False
|
|
|
|
with util.tempdir() as tdir:
|
|
|
|
cmd = [util.abs_join(find_root(), 'tools', 'read-version')]
|
|
(sysout, _stderr) = util.subp(cmd)
|
|
version = sysout.strip()
|
|
|
|
cmd = ['bzr', 'revno']
|
|
(sysout, _stderr) = util.subp(cmd)
|
|
revno = sysout.strip()
|
|
|
|
# This is really only a temporary archive
|
|
# since we will extract it then add in the debian
|
|
# folder, then re-archive it for debian happiness
|
|
print("Creating a temporary tarball using the 'make-tarball' helper")
|
|
cmd = [util.abs_join(find_root(), 'tools', 'make-tarball')]
|
|
(sysout, _stderr) = util.subp(cmd)
|
|
arch_fn = sysout.strip()
|
|
tmp_arch_fn = util.abs_join(tdir, os.path.basename(arch_fn))
|
|
shutil.move(arch_fn, tmp_arch_fn)
|
|
|
|
print("Extracting temporary tarball %r" % (tmp_arch_fn))
|
|
cmd = ['tar', '-xvzf', tmp_arch_fn, '-C', tdir]
|
|
util.subp(cmd, capture=capture)
|
|
extracted_name = tmp_arch_fn[:-len('.tar.gz')]
|
|
os.remove(tmp_arch_fn)
|
|
|
|
xdir = util.abs_join(tdir, 'cloud-init')
|
|
shutil.move(extracted_name, xdir)
|
|
|
|
print("Creating a debian/ folder in %r" % (xdir))
|
|
if not args.no_cloud_utils:
|
|
append_requires=['cloud-utils | cloud-guest-utils']
|
|
else:
|
|
append_requires=[]
|
|
write_debian_folder(xdir, version, revno, append_requires)
|
|
|
|
# The naming here seems to follow some debian standard
|
|
# so it will whine if it is changed...
|
|
tar_fn = "cloud-init_%s~bzr%s.orig.tar.gz" % (version, revno)
|
|
print("Archiving the adjusted source into %r" %
|
|
(util.abs_join(tdir, tar_fn)))
|
|
cmd = ['tar', '-czvf',
|
|
util.abs_join(tdir, tar_fn),
|
|
'-C', xdir]
|
|
cmd.extend(os.listdir(xdir))
|
|
util.subp(cmd, capture=capture)
|
|
|
|
# Copy it locally for reference
|
|
shutil.copy(util.abs_join(tdir, tar_fn),
|
|
util.abs_join(os.getcwd(), tar_fn))
|
|
print("Copied that archive to %r for local usage (if desired)." %
|
|
(util.abs_join(os.getcwd(), tar_fn)))
|
|
|
|
print("Running 'debuild' in %r" % (xdir))
|
|
with util.chdir(xdir):
|
|
cmd = ['debuild', '--preserve-envvar', 'INIT_SYSTEM']
|
|
if args.debuild_args:
|
|
cmd.extend(args.debuild_args)
|
|
util.subp(cmd, capture=capture)
|
|
|
|
link_fn = os.path.join(os.getcwd(), 'cloud-init_all.deb')
|
|
link_dsc = os.path.join(os.getcwd(), 'cloud-init.dsc')
|
|
for base_fn in os.listdir(os.path.join(tdir)):
|
|
full_fn = os.path.join(tdir, base_fn)
|
|
if not os.path.isfile(full_fn):
|
|
continue
|
|
shutil.move(full_fn, base_fn)
|
|
print("Wrote %r" % (base_fn))
|
|
if base_fn.endswith('_all.deb'):
|
|
# Add in the local link
|
|
util.del_file(link_fn)
|
|
os.symlink(base_fn, link_fn)
|
|
print("Linked %r to %r" % (base_fn,
|
|
os.path.basename(link_fn)))
|
|
if base_fn.endswith('.dsc'):
|
|
util.del_file(link_dsc)
|
|
os.symlink(base_fn, link_dsc)
|
|
print("Linked %r to %r" % (base_fn,
|
|
os.path.basename(link_dsc)))
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|