Skip to content

Commit

Permalink
Persistent shared dirs
Browse files Browse the repository at this point in the history
  • Loading branch information
jmichalski-ant committed Feb 5, 2024
1 parent fb10cdc commit b0865fc
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 14 deletions.
61 changes: 61 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,67 @@ jobs:
git+https://github.com/antmicro/tuttest.git@c44309e0365c54759fb36864fb77bf8b347bd647
repos: https://github.com/antmicro/pyrav4l2.git pyrav4l2

riscv64-shared-dirs-test:
runs-on: ubuntu-latest
needs: send-to-releases
if: ${{ !failure() && !github.event.act }}
steps:
- uses: actions/checkout@v3

- name: prepare shared directiories
run: mkdir shared_dir shared_dir2

- name: test
uses: ./
with:
rootfs-size: +128M
shared-dirs: |
shared_dir /home/shared_dir
shared_dir2 /home/shared_dir2
renode-run: |
echo "shared-dirs-test" > shared_dir/f.txt
echo "shared-dirs-test2" > shared_dir2/f.txt
- name: read shared directories
run: |
$([ "$(cat shared_dir/f.txt)" = "shared-dirs-test" ])
$([ "$(cat shared_dir2/f.txt)" = "shared-dirs-test2" ])
ls shared_dir
cat shared_dir/f.txt
ls shared_dir2
cat shared_dir2/f.txt
arm32-shared-dirs-test:
runs-on: ubuntu-latest
needs: send-to-releases
if: ${{ !failure() && !github.event.act }}
steps:
- uses: actions/checkout@v3

- name: prepare shared directiories
run: mkdir shared_dir shared_dir2

- name: test
uses: ./
with:
arch: arm32
rootfs-size: +128M
shared-dirs: |
shared_dir /home/shared_dir
shared_dir2 /home/shared_dir2
renode-run: |
echo "shared-dirs-test" > shared_dir/f.txt
echo "shared-dirs-test2" > shared_dir2/f.txt
- name: read shared directories
run: |
$([ "$(cat shared_dir/f.txt)" = "shared-dirs-test" ])
$([ "$(cat shared_dir2/f.txt)" = "shared-dirs-test2" ])
ls shared_dir
cat shared_dir/f.txt
ls shared_dir2
cat shared_dir2/f.txt
arm32-test:
runs-on: ubuntu-latest
needs: send-to-releases
Expand Down
2 changes: 1 addition & 1 deletion action/device/hifive_unleashed/init.resc
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ machine LoadPlatformDescription @action/device/hifive_unleashed/platform.repl

# rootfs
machine LoadPlatformDescriptionFromString 'virtio: Storage.VirtIOBlockDevice @ sysbus 0x100d0000 { IRQ -> plic@50 }'
virtio LoadImage @images/rootfs.img
virtio LoadImage @images/rootfs.img true

showAnalyzer uart0
e51 LogFunctionNames true
Expand Down
2 changes: 1 addition & 1 deletion action/device/zynq_7000/init.resc
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ ttc1 Frequency 33333333

# rootfs
machine LoadPlatformDescriptionFromString 'virtio: Storage.VirtIOBlockDevice @ sysbus 0xe0104000 { IRQ -> gic@63 }'
virtio LoadImage @images/rootfs.img
virtio LoadImage @images/rootfs.img true

# This setting increases emulation speed, thus mitigates networks errors and speedup user scripts.
machine SetAdvanceImmediately true
Expand Down
42 changes: 31 additions & 11 deletions action/images.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,36 @@ def prepare_kernel_and_initramfs(kernel: str):
error("Kernel not found! Action expects Image or vmlinux file.")


def rootfs_size(size_str: str) -> int:
"""
Returns rootfs size
Parameters
----------
size_str: str
rootfs-size action parameter value
"""

units = {
"B": 1,
"K": 1024,
"M": 1024**2,
"G": 1024**3
}

if size_str == "auto" or size_str.startswith("+"):
size = 0
for path, _, files in os.walk("images/rootfs"):
for f in files:
fp = os.path.join(path, f)
if not os.path.islink(fp):
size += os.path.getsize(fp)

additional_size = int(size_str[:-1]) * units[size_str[-1]] if size_str.startswith("+") and size_str[-1] in units else 0
return max(size * 2, 5 * 10**7) + additional_size
return int(size_str)


def burn_rootfs_image(
user_directory: str,
image: str,
Expand Down Expand Up @@ -185,18 +215,8 @@ def burn_rootfs_image(
dirs_exist_ok=True
)

if image_size == "auto":
size = 0
for path, _, files in os.walk("images/rootfs"):
for f in files:
fp = os.path.join(path, f)
if not os.path.islink(fp):
size += os.path.getsize(fp)

image_size = f'{max(size * 2, 5 * 10**7)}'
try:

run(["truncate", "images/rootfs.img", "-s", image_size], check=True)
run(["truncate", "images/rootfs.img", "-s", f"{rootfs_size(image_size)}"], check=True)
run(["mkfs.ext4", "-d", "images/rootfs", "images/rootfs.img"],
check=True,
stdout=DEVNULL)
Expand Down
14 changes: 13 additions & 1 deletion action/run-in-renode.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,17 @@
from common import get_file, error, archs
from devices import add_devices
from dependencies import add_repos, add_packages
from images import prepare_shared_directories, prepare_kernel_and_initramfs, burn_rootfs_image
from images import prepare_shared_directories, prepare_kernel_and_initramfs, burn_rootfs_image, shared_directories_actions
from dispatcher import CommandDispatcher
from subprocess import run

from datetime import datetime

import sys
import json
import yaml
import shutil
import os


DEFAULT_IMAGE_PATH = "https://github.com/{}/releases/download/{}/image-{}-default.tar.xz"
Expand Down Expand Up @@ -146,3 +149,12 @@ def test_task(test_task_str: str):
dispatcher.add_task(test_task(args.get("renode-run", "")))

dispatcher.evaluate()

run(["mkdir", "rootfs"], check=True)
run(["sudo", "mount", "images/rootfs.img", "rootfs"], check=True)

for dir in shared_directories_actions:
src = f"rootfs/{dir.target}"
dst = f"{user_directory}/{dir.host}" if not dir.host.startswith('/') else dir.host
if os.path.exists(src):
shutil.copytree(src, dst, dirs_exist_ok=True)
9 changes: 9 additions & 0 deletions action/tasks/save_shared_dirs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name: save_shared_dirs
shell: target
requires: [action_test]
echo: true
timeout: 5
fail-fast: false
commands:
- sync
# - umount /dev/vda

0 comments on commit b0865fc

Please sign in to comment.