|
21 | 21 | from jumpstarter_driver_opendal.driver import FlasherInterface |
22 | 22 | from jumpstarter_driver_power.driver import PowerInterface, PowerReading |
23 | 23 | from jumpstarter_driver_pyserial.driver import PySerial |
24 | | -from pydantic import BaseModel, ByteSize, Field, TypeAdapter, validate_call |
| 24 | +from pydantic import BaseModel, ByteSize, Field, TypeAdapter, ValidationError, validate_call |
25 | 25 | from qemu.qmp import QMPClient |
26 | 26 | from qemu.qmp.protocol import ConnectError, Runstate |
27 | 27 |
|
@@ -183,9 +183,7 @@ async def on(self) -> None: # noqa: C901 |
183 | 183 |
|
184 | 184 | # Resize disk if configured |
185 | 185 | if self.parent.disk_size: |
186 | | - # Convert QEMU binary format (20G) to Pydantic format (20GiB) |
187 | | - s = self.parent.disk_size |
188 | | - requested = int(TypeAdapter(ByteSize).validate_python(s + "iB" if s[-1] in "kmgtKMGT" else s)) |
| 186 | + requested = self.parent._parse_size(self.parent.disk_size) |
189 | 187 |
|
190 | 188 | if requested < current_virtual_size: |
191 | 189 | raise RuntimeError( |
@@ -406,24 +404,23 @@ def get_username(self) -> str: |
406 | 404 | def get_password(self) -> str: |
407 | 405 | return self.password |
408 | 406 |
|
409 | | - def _validate_size(self, size: str) -> None: |
410 | | - """Validate size string (e.g., '20G', '512M').""" |
| 407 | + def _parse_size(self, size: str) -> int: |
| 408 | + """Parse size string (e.g., '20G') to bytes.""" |
411 | 409 | try: |
412 | | - s = size |
413 | | - TypeAdapter(ByteSize).validate_python(s + "iB" if s[-1] in "kmgtKMGT" else s) |
414 | | - except Exception: |
| 410 | + return int(TypeAdapter(ByteSize).validate_python(size + "iB" if size[-1] in "kmgtKMGT" else size)) |
| 411 | + except (ValidationError, IndexError): |
415 | 412 | raise ValueError(f"Invalid size: '{size}'. Use e.g. '20G', '512M', '2T'") from None |
416 | 413 |
|
417 | 414 | @export |
418 | 415 | @validate_call(validate_return=True) |
419 | 416 | def set_disk_size(self, size: str) -> None: |
420 | 417 | """Set the disk size for resizing before boot.""" |
421 | | - self._validate_size(size) |
| 418 | + self._parse_size(size) # Validate |
422 | 419 | self.disk_size = size |
423 | 420 |
|
424 | 421 | @export |
425 | 422 | @validate_call(validate_return=True) |
426 | 423 | def set_memory_size(self, size: str) -> None: |
427 | 424 | """Set the memory size for next boot.""" |
428 | | - self._validate_size(size) |
| 425 | + self._parse_size(size) # Validate |
429 | 426 | self.mem = size |
0 commit comments