@@ -682,6 +682,33 @@ def _norm(value: Any, default: str = "") -> str:
682682 net = NetSpec (driver = net_driver , bridge = net_bridge , nics = nics , host_bridge = net_host_bridge , uplink = net_uplink )
683683 return Spec (vm = vm , host = host , vmext = vmext , storage = storage , net = net )
684684
685+ def _build_storage_spec (self , vm : "VMDetails" , payload : Dict [str , Any ]) -> "StorageSpec" :
686+ storage_defaults = self .agent_defaults .get ("storage" , {}) if isinstance (self .agent_defaults , dict ) else {}
687+ driver = (storage_defaults .get ("driver" ) or "file" ).lower ()
688+ volume_dir = storage_defaults .get ("volume_dir" , "/var/lib/firecracker/volumes" )
689+ size = storage_defaults .get ("size" )
690+
691+ spec = StorageSpec (driver = driver , volume_file = str (Path (volume_dir ) / f"{ vm .name } .img" ), size = size )
692+
693+ if driver == "lvm" :
694+ vg = storage_defaults .get ("volume_group" ) or storage_defaults .get ("vg" )
695+ if not vg :
696+ raise HTTPException (status_code = 500 , detail = "storage.volume_group required for lvm" )
697+ spec .vg = vg
698+ return spec
699+
700+ if driver == "lvmthin" :
701+ vg = storage_defaults .get ("volume_group" ) or storage_defaults .get ("vg" )
702+ pool = storage_defaults .get ("thinpool" )
703+ if not vg or not pool :
704+ raise HTTPException (status_code = 500 , detail = "storage.volume_group and storage.thinpool required for lvmthin" )
705+ spec .vg = vg
706+ spec .thinpool = pool
707+ return spec
708+
709+ spec .driver = "file"
710+ return spec
711+
685712 def _cfg_to_spec (self , cfg : Dict [str , Any ], vm_name : str ) -> Spec :
686713 """Convert configuration to Spec object."""
687714 from models import HostDetails , NetSpec , NIC , StorageSpec , VMDetails , VMExt
0 commit comments