11from contextlib import contextmanager
22
3+ import click
34from jumpstarter_driver_composite .client import CompositeClient
45from jumpstarter_driver_network .adapters import FabricAdapter , NovncAdapter
56
7+ from jumpstarter .client .decorators import driver_click_group
8+
69
710class QemuClient (CompositeClient ):
811 @property
@@ -17,6 +20,14 @@ def username(self) -> str:
1720 def password (self ) -> str :
1821 return self .call ("get_password" )
1922
23+ def set_disk_size (self , size : str ) -> None :
24+ """Set the disk size for resizing before boot."""
25+ self .call ("set_disk_size" , size )
26+
27+ def set_memory_size (self , size : str ) -> None :
28+ """Set the memory size for next boot."""
29+ self .call ("set_memory_size" , size )
30+
2031 @contextmanager
2132 def novnc (self ):
2233 with NovncAdapter (client = self .vnc ) as url :
@@ -30,3 +41,30 @@ def shell(self):
3041 connect_kwargs = {"password" : self .password },
3142 ) as conn :
3243 yield conn
44+
45+ def cli (self ):
46+ @driver_click_group (self )
47+ def base ():
48+ """QEMU virtual machine operations"""
49+ pass
50+
51+ @base .group ()
52+ def resize ():
53+ """Resize QEMU resources"""
54+ pass
55+
56+ @resize .command (name = "disk" )
57+ @click .argument ("size" )
58+ def resize_disk (size ):
59+ """Resize the root disk (e.g., 20G). Run before power on."""
60+ self .set_disk_size (size )
61+ click .echo (f"Disk will be resized to { size } on next power on" )
62+
63+ @resize .command (name = "memory" )
64+ @click .argument ("size" )
65+ def resize_memory (size ):
66+ """Set memory size (e.g., 2G, 4G). Takes effect on next boot."""
67+ self .set_memory_size (size )
68+ click .echo (f"Memory will be set to { size } on next power on" )
69+
70+ return base
0 commit comments