Skip to content

Commit 6fca904

Browse files
committed
Fix firecracker instance test
Adapt to new arch Rename to test_create_firecracker_instance Use mocker to patch() settings so it doesn't contamine other tests Ensure it ping properly to confirm it is working
1 parent 21a1161 commit 6fca904

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

tests/supervisor/test_instance.py

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ class MockSystemDManager(SystemDManager):
2323
execution: MicroVM | None = None
2424
process: Process | None = None
2525

26-
async def enable_and_start(self, vm_hash: str):
26+
async def enable_and_start(self, service: str) -> tuple[MicroVM, Process]:
27+
vm_hash = service.split("@", maxsplit=1)[1].split(".", maxsplit=1)[0]
28+
2729
config_path = Path(f"{settings.EXECUTION_ROOT}/{vm_hash}-controller.json")
2830
config = configuration_from_file(config_path)
2931
self.execution, self.process = await execute_persistent_vm(config)
@@ -35,7 +37,7 @@ def is_service_enabled(self, service: str):
3537
def is_service_active(self, service: str):
3638
return self.process is not None
3739

38-
async def stop_and_disable(self, vm_hash: str):
40+
async def stop_and_disable(self, service: str):
3941
if self.execution:
4042
await self.execution.shutdown()
4143
await self.execution.stop()
@@ -45,25 +47,31 @@ async def stop_and_disable(self, vm_hash: str):
4547

4648

4749
@pytest.mark.asyncio
48-
async def test_create_instance():
49-
"""
50-
Create a fake instance locally and check that it start / init / stop properly.
50+
async def test_create_firecracker_instance(mocker):
51+
"""Create a fake instance locally and check that it start / init / stop properly.
52+
53+
NOTE: If Firecracker VM fail to boot because the disk is broken try:
54+
```bash
55+
sudo dmsetup remove decadecadecadecadecadecadecadecadecadecadecadecadecadecadecadeca_rootfs
56+
sudo dmsetup remove decadecadecadecadecadecadecadecadecadecadecadecadecadecadecadeca_base
57+
sudo losetup -l | grep 'persistent' | grep deleted | awk '{print $1}' | sudo xargs -I{} losetup -d {}
58+
sudo rm -rf /var/lib/aleph/vm/volumes/persistent/decadecadecadecadecadecadecadecadecadecadecadecadecadecadecadeca/rootfs.btrfs
59+
```
5160
"""
61+
mocker.patch.object(settings, "ALLOW_VM_NETWORKING", True)
62+
mocker.patch.object(settings, "USE_FAKE_INSTANCE_BASE", True)
63+
mocker.patch.object(settings, "FAKE_DATA_PROGRAM", settings.BENCHMARK_FAKE_DATA_PROGRAM)
64+
mocker.patch.object(settings, "USE_JAILER", True)
5265

53-
settings.USE_FAKE_INSTANCE_BASE = True
54-
settings.FAKE_DATA_PROGRAM = settings.BENCHMARK_FAKE_DATA_PROGRAM
55-
# settings.FAKE_INSTANCE_MESSAGE
56-
settings.ALLOW_VM_NETWORKING = True
57-
settings.USE_JAILER = True
58-
59-
logging.basicConfig(level=logging.DEBUG)
60-
settings.PRINT_SYSTEM_LOGS = True
66+
# logging.basicConfig(level=logging.DEBUG)
6167

6268
# Ensure that the settings are correct and required files present.
6369
settings.setup()
6470
settings.check()
6571
if not settings.FAKE_INSTANCE_BASE.exists():
66-
pytest.xfail("Test Runtime not setup. run `cd runtimes/instance-rootfs && sudo ./create-debian-12-disk.sh`")
72+
pytest.xfail(
73+
f"Test Runtime not setup. {settings.FAKE_INSTANCE_BASE}. run `cd runtimes/instance-rootfs && sudo ./create-debian-12-disk.sh`"
74+
)
6775

6876
# The database is required for the metrics and is currently not optional.
6977
engine = metrics.setup_engine()
@@ -93,7 +101,7 @@ async def test_create_instance():
93101
message=message.content,
94102
original=message.content,
95103
snapshot_manager=None,
96-
systemd_manager=None,
104+
systemd_manager=mock_systemd_manager,
97105
persistent=True,
98106
)
99107

@@ -114,13 +122,17 @@ async def test_create_instance():
114122
assert vm.enable_networking
115123

116124
await execution.start()
117-
firecracker_execution, process = await mock_systemd_manager.enable_and_start(execution.vm_hash)
125+
# firecracker_execution, process = await mock_systemd_manager.enable_and_start(execution.vm_hash)
126+
firecracker_execution = mock_systemd_manager.execution
118127
assert isinstance(firecracker_execution, MicroVM)
119128
assert firecracker_execution.proc is not None
120-
await execution.wait_for_persistent_boot()
121129

122-
# This sleep is to leave the instance to boot up and prevent disk corruption
130+
await execution.init_task
131+
assert execution.init_task.result() is True, "VM failed to start"
132+
133+
# This sleep is to leave the instance to boo
134+
# up and prevent disk corruption
123135
await asyncio.sleep(60)
124-
firecracker_execution, process = await mock_systemd_manager.stop_and_disable(execution.vm_hash)
136+
firecracker_execution, process = await mock_systemd_manager.stop_and_disable(execution.controller_service)
125137
await execution.stop()
126138
assert firecracker_execution is None

0 commit comments

Comments
 (0)