2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-22 09:57:41 +00:00

[#1752] hammer: fixed creating system for HA testing in Forge

This commit is contained in:
Michal Nowikowski 2021-03-15 09:54:46 +01:00
parent 261d08df4d
commit 52c9c09dbc

View File

@ -625,7 +625,7 @@ class VagrantEnv(object):
def package(self): def package(self):
"""Package Vagrant system into Vagrant box.""" """Package Vagrant system into Vagrant box."""
execute('vagrant halt', cwd=self.vagrant_dir, dry_run=self.dry_run, raise_error=False) execute('vagrant halt', cwd=self.vagrant_dir, dry_run=self.dry_run, raise_error=False, attempts=3)
box_path = os.path.join(self.vagrant_dir, 'kea-%s-%s.box' % (self.system, self.revision)) box_path = os.path.join(self.vagrant_dir, 'kea-%s-%s.box' % (self.system, self.revision))
if os.path.exists(box_path): if os.path.exists(box_path):
@ -641,6 +641,8 @@ class VagrantEnv(object):
execute('sudo rm -rf %s' % lxc_box_dir) execute('sudo rm -rf %s' % lxc_box_dir)
os.mkdir(lxc_box_dir) os.mkdir(lxc_box_dir)
lxc_container_path = os.path.join('/var/lib/lxc', self.name) lxc_container_path = os.path.join('/var/lib/lxc', self.name)
# add vagrant universal key to accepted keys
execute('sudo bash -c \'echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8ia' execute('sudo bash -c \'echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8ia'
'llvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ' 'llvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ'
'6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTB' '6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTB'
@ -649,13 +651,26 @@ class VagrantEnv(object):
'YSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYC' 'YSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYC'
'zRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key"' 'zRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key"'
'> %s/rootfs/home/vagrant/.ssh/authorized_keys\'' % lxc_container_path) '> %s/rootfs/home/vagrant/.ssh/authorized_keys\'' % lxc_container_path)
# reset machine-id
execute('sudo rm -f %s/rootfs/var/lib/dbus/machine-id' % lxc_container_path)
#execute('sudo truncate -s 0 %s/rootfs/etc/machine-id' % lxc_container_path)
execute('sudo rm -f %s/rootfs/etc/machine-id' % lxc_container_path)
# pack rootfs
cmd = 'sudo bash -c "' cmd = 'sudo bash -c "'
cmd += 'cd %s ' cmd += 'cd %s '
cmd += '&& tar --numeric-owner --anchored --exclude=./rootfs/dev/log -czf %s/rootfs.tar.gz ./rootfs/*' cmd += '&& tar --numeric-owner --anchored --exclude=./rootfs/dev/log -czf %s/rootfs.tar.gz ./rootfs/*'
cmd += '"' cmd += '"'
execute(cmd % (lxc_container_path, lxc_box_dir)) execute(cmd % (lxc_container_path, lxc_box_dir))
# copy lxc config from runtime container
execute('sudo cp %s/config %s/lxc-config' % (lxc_container_path, lxc_box_dir)) execute('sudo cp %s/config %s/lxc-config' % (lxc_container_path, lxc_box_dir))
# remove mac address from eth0 - it should be dynamically assigned
execute("sudo sed -i '/lxc.net.0.hwaddr/d' %s/lxc-config" % lxc_box_dir)
# correct files ownership
execute('sudo chown `id -un`:`id -gn` *', cwd=lxc_box_dir) execute('sudo chown `id -un`:`id -gn` *', cwd=lxc_box_dir)
# and other metadata
with open(os.path.join(lxc_box_dir, 'metadata.json'), 'w') as f: with open(os.path.join(lxc_box_dir, 'metadata.json'), 'w') as f:
now = datetime.datetime.now() now = datetime.datetime.now()
f.write('{\n') f.write('{\n')
@ -664,6 +679,7 @@ class VagrantEnv(object):
f.write(' "built-on": "%s"\n' % now.strftime('%c')) f.write(' "built-on": "%s"\n' % now.strftime('%c'))
f.write('}\n') f.write('}\n')
# pack vagrant box with metadata and config
execute('tar -czf %s ./*' % box_path, cwd=lxc_box_dir) execute('tar -czf %s ./*' % box_path, cwd=lxc_box_dir)
execute('sudo rm -rf %s' % lxc_box_dir) execute('sudo rm -rf %s' % lxc_box_dir)
@ -913,6 +929,31 @@ class VagrantEnv(object):
dt // 60, dt % 60) dt // 60, dt % 60)
log.info('') log.info('')
def prepare_for_boxing(self):
if self.system not in ['debian', 'ubuntu', 'fedora', 'centos', 'rhel']:
return
# setup a script that on first boot will set machine-id
cmd = 'bash -c \'cat <<EOF | sudo tee /usr/lib/systemd/system/systemd-firstboot.service\n'
cmd += '[Unit]\n'
cmd += 'Description=Generate New Machine ID\n'
cmd += 'Documentation=man:systemd-firstboot(1)\n'
cmd += 'DefaultDependencies=no\n'
cmd += 'Conflicts=shutdown.target\n'
cmd += 'After=systemd-remount-fs.service\n'
cmd += 'Before=systemd-sysusers.service sysinit.target shutdown.target\n'
cmd += 'ConditionPathIsReadWrite=/etc\n'
cmd += 'ConditionFirstBoot=yes\n'
cmd += '[Service]\n'
cmd += 'Type=oneshot\n'
cmd += 'RemainAfterExit=yes\n'
cmd += 'ExecStart=/usr/bin/systemd-firstboot --setup-machine-id\n'
cmd += '[Install]\n'
cmd += 'WantedBy=sysinit.target\n'
cmd += "EOF\n\'"
self.execute(cmd)
self.execute('sudo systemctl enable systemd-firstboot.service')
def _install_gtest_sources(): def _install_gtest_sources():
"""Install gtest sources.""" """Install gtest sources."""
@ -1035,6 +1076,7 @@ def _configure_pgsql(system, features):
# local all all peer # local all all peer
# to: # to:
# local all all md5 # local all all md5
log.info('postgresql just configured') log.info('postgresql just configured')
@ -1956,16 +1998,17 @@ def build_in_vagrant(provider, system, revision, features, leave_system, tarball
return dt, error, total, passed return dt, error, total, passed
def package_box(provider, system, revision, features, dry_run, check_times, reuse): def package_box(provider, system, revision, features, dry_run, check_times, reuse, skip_upload):
"""Prepare Vagrant box of specified system.""" """Prepare Vagrant box of specified system."""
ve = VagrantEnv(provider, system, revision, features, 'bare', dry_run, check_times=check_times) ve = VagrantEnv(provider, system, revision, features, 'bare', dry_run, check_times=check_times)
if not reuse: if not reuse:
ve.destroy() ve.destroy()
ve.bring_up_latest_box() ve.bring_up_latest_box()
ve.prepare_system() ve.prepare_system()
# TODO cleanup ve.prepare_for_boxing()
box_path = ve.package() box_path = ve.package()
ve.upload_to_cloud(box_path) if not skip_upload:
ve.upload_to_cloud(box_path)
def ssh(provider, system, revision): def ssh(provider, system, revision):
@ -2174,6 +2217,9 @@ def parse_args():
help='Repository for 3rd party dependencies and for uploading built packages.') help='Repository for 3rd party dependencies and for uploading built packages.')
parser.add_argument('-u', '--reuse', action='store_true', parser.add_argument('-u', '--reuse', action='store_true',
help='Reuse existing system image, otherwise (default case) if there is any exising then destroy it first.') help='Reuse existing system image, otherwise (default case) if there is any exising then destroy it first.')
parser.add_argument('-k', '--skip-upload', action='store_true',
help='Skip uploading prepared box to cloud, otherwise (default case) upload it.')
args = main_parser.parse_args() args = main_parser.parse_args()
@ -2446,7 +2492,7 @@ def main():
features = set(['docs', 'perfdhcp', 'shell', 'mysql', 'pgsql', 'radius', 'native-pkg']) features = set(['docs', 'perfdhcp', 'shell', 'mysql', 'pgsql', 'radius', 'native-pkg'])
log.info('Enabled features: %s', ' '.join(features)) log.info('Enabled features: %s', ' '.join(features))
package_box(args.provider, args.system, args.revision, features, args.dry_run, args.check_times, args.reuse) package_box(args.provider, args.system, args.revision, features, args.dry_run, args.check_times, args.reuse, args.skip_upload)
elif args.command == "prepare-system": elif args.command == "prepare-system":
prepare_system_cmd(args) prepare_system_cmd(args)