canonical-ubuntu-qa team mailing list archive
-
canonical-ubuntu-qa team
-
Mailing list archive
-
Message #05729
[Merge] ~andersson123/autopkgtest-cloud:hacks-to-deploy-storage into autopkgtest-cloud:master
Tim Andersson has proposed merging ~andersson123/autopkgtest-cloud:hacks-to-deploy-storage into autopkgtest-cloud:master.
Requested reviews:
Canonical's Ubuntu QA (canonical-ubuntu-qa)
For more details, see:
https://code.launchpad.net/~andersson123/autopkgtest-cloud/+git/autopkgtest-cloud/+merge/476792
Sometimes (lol) our /tmp storage is not mounted on our cloud/lxd worker units. This MP implements a workaround to this bug.
--
Your team Canonical's Ubuntu QA is requested to review the proposed merge of ~andersson123/autopkgtest-cloud:hacks-to-deploy-storage into autopkgtest-cloud:master.
diff --git a/charms/focal/autopkgtest-cloud-worker/reactive/autopkgtest_cloud_worker.py b/charms/focal/autopkgtest-cloud-worker/reactive/autopkgtest_cloud_worker.py
index 47fe98f..a172fbd 100644
--- a/charms/focal/autopkgtest-cloud-worker/reactive/autopkgtest_cloud_worker.py
+++ b/charms/focal/autopkgtest-cloud-worker/reactive/autopkgtest_cloud_worker.py
@@ -731,7 +731,7 @@ def reload_systemd_units():
@hook("tmp-storage-attached")
def fix_tmp_permissions():
- status.maintenance("Fixing tmp permissions")
+ status.maintenance("Checking to see if storage is mounted...")
storageids = storage_list("tmp")
if not storageids:
status.blocked("Cannot locate attached storage")
@@ -739,7 +739,70 @@ def fix_tmp_permissions():
storageid = storageids[0]
mount = storage_get("location", storageid)
+ agent_dirs = Path("/var/lib/juju/agents").glob("*")
+ storage_min_size = None
+ for agent in agent_dirs:
+ dir_name = str(agent).rsplit("/", maxsplit=1)[-1]
+ if dir_name.startswith("unit-autopkgtest"):
+ with open(agent / "charm" / "metadata.yaml") as file:
+ metadata_yaml = yaml.safe_load(file)
+ storage_min_size = int(
+ metadata_yaml["storage"][mount.replace("/", "")][
+ "minimum-size"
+ ].replace("G", "")
+ )
+ block_device = None
+ try:
+ subprocess.check_call(["findmnt", "-T", mount], shell=True)
+ filesystems = json.loads(
+ subprocess.check_output(
+ f"findmnt -T {mount} --json", shell=True
+ ).decode("utf-8")
+ )["filesystems"]
+ assert len(filesystems) == 1
+ assert filesystems[0]["target"] == mount
+ status.maintenance(f"{mount} storage already mounted!")
+ except (subprocess.CalledProcessError, KeyError, AssertionError):
+ status.maintenance(
+ "tmp storage not mounted! Finding appropriate disk to mount..."
+ )
+ block_devices = json.loads(
+ subprocess.check_output("lsblk --json", shell=True).decode("utf-8")
+ )["blockdevices"]
+ for device in block_devices:
+ try:
+ for child in device["children"]:
+ if (
+ child["mountpoint"] is None
+ and child["size"].endswith("G")
+ and int(child["size"].replace("G", ""))
+ >= storage_min_size
+ ):
+ block_device = f"/dev/{child['name']}"
+ status.maintenance(
+ f"Looks like {block_device} is unmounted, attempting to mount..."
+ )
+ try:
+ subprocess.check_call(
+ ["mount", block_device, mount]
+ )
+ status.maintenance(
+ f"Mounted {block_device} to {mount}"
+ )
+ except subprocess.CalledProcessError as e:
+ status.maintenance(
+ f"Mounting storage failed with: {e}"
+ )
+ except KeyError:
+ continue
+ fstab = Path("/etc/fstab")
+ fstab_entry = f"{block_device} {mount} ext4 nofail,relatime,rw 0 0"
+ status.maintenance(
+ f"Writing the following line to {str(fstab.absolute())}:\n{fstab_entry}"
+ )
+ fstab.write_text(f"{fstab.read_text()}\n{fstab_entry}\n")
+ status.maintenance("Fixing tmp permissions")
os.chmod(mount, 0o777)
status.maintenance("Done fixing tmp permissions")