build-livefs-lxd: configure apt proxy and package_update via cloud-init

Read http-proxy from --http-proxy flag or build-livefs.conf and pass it
to the VM at launch time via cloud-init user-data (apt.http_proxy /
apt.https_proxy). Also set package_update: true so cloud-init runs
apt-get update on first boot, removing the need for an explicit call.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
michael.hudson@canonical.com 2026-02-27 17:57:11 +13:00
parent cdd2b7fb01
commit 2b2c057acf
No known key found for this signature in database
GPG Key ID: 80E627A0AB757E23

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import configparser
import pathlib import pathlib
import subprocess import subprocess
import time import time
@ -7,6 +8,15 @@ import time
import click import click
_CONFIG_FILE = pathlib.Path.home() / ".config" / "livecd-rootfs" / "build-livefs.conf"
def _read_config() -> dict[str, str]:
cp = configparser.ConfigParser()
cp.read(_CONFIG_FILE)
return dict(cp["defaults"]) if "defaults" in cp else {}
@click.command( @click.command(
context_settings={"ignore_unknown_options": True, "allow_extra_args": True} context_settings={"ignore_unknown_options": True, "allow_extra_args": True}
) )
@ -16,25 +26,39 @@ import click
default=None, default=None,
help="LXD VM name (default: livefs-builder-{suite})", help="LXD VM name (default: livefs-builder-{suite})",
) )
@click.option(
"--http-proxy",
default=None,
help="HTTP proxy URL for apt inside the VM (also read from build-livefs.conf)",
)
@click.argument("extra_args", nargs=-1, type=click.UNPROCESSED) @click.argument("extra_args", nargs=-1, type=click.UNPROCESSED)
def main(suite, vm_name, extra_args): def main(suite, vm_name, http_proxy, extra_args):
livecd_rootfs_root = pathlib.Path(__file__).resolve().parent.parent livecd_rootfs_root = pathlib.Path(__file__).resolve().parent.parent
vm_name = vm_name or f"livefs-builder-{suite}" vm_name = vm_name or f"livefs-builder-{suite}"
host_conf = ( host_conf = (
pathlib.Path.home() / ".config" / "livecd-rootfs" / "build-livefs.conf" pathlib.Path.home() / ".config" / "livecd-rootfs" / "build-livefs.conf"
) )
if http_proxy is None:
http_proxy = _read_config().get("http-proxy")
result = subprocess.run(["lxc", "info", vm_name], capture_output=True) result = subprocess.run(["lxc", "info", vm_name], capture_output=True)
if result.returncode != 0: if result.returncode != 0:
subprocess.run( launch_cmd = [
[ "lxc", "launch", f"ubuntu-daily:{suite}", vm_name, "--vm",
"lxc", "launch", f"ubuntu-daily:{suite}", vm_name, "--vm", "--config", "limits.cpu=4",
"--config", "limits.cpu=4", "--config", "limits.memory=8GiB",
"--config", "limits.memory=8GiB", "--device", "root,size=100GiB",
"--device", "root,size=100GiB", ]
], user_data = "#cloud-config\npackage_update: true\n"
check=True, if http_proxy is not None:
) user_data += (
"apt:\n"
f" http_proxy: {http_proxy}\n"
f" https_proxy: {http_proxy}\n"
)
launch_cmd += ["--config", f"user.user-data={user_data}"]
subprocess.run(launch_cmd, check=True)
device_info = subprocess.run( device_info = subprocess.run(
["lxc", "config", "device", "show", vm_name], ["lxc", "config", "device", "show", vm_name],