&qa8*`dZddlmZddlmZ ddlZn #e$rdZYnwxYwdZdZdZ d Z dS) z2Kernel-side LVP/LVE operations via pylve bindings.)PyLve)LvdErrorNcttdtt}||std|S)z'Initialize and return a PyLve instance.Nzpylve module not availablezDkernel does not support per-domain limits (requires lve_lvp_create2))pylverr initializedomains_supported)pys py/websiteisolation/limits.py get_pylver s^ }3444 uBMMOOO   ! !5455 5 IcZ|}d|vrt|d|_d|vrt|d|_d|vrt|d|_d|vrt|d|_d|vrt|d|_|S)z*Create liblve_settings from a limits dict.cpupmemionprociops)liblve_settingsintls_cpu ls_memory_phyls_iols_nprocls_iops)r limitssettingss r settings_from_limitsrs!!##H fUm,, !$VF^!4!4 v~~VD\**&w00 vf~.. Or cD|j|j|j|j|jdS)z2Convert liblve_settings to a dict of limit fields.)rrrrr)rrrrr)rs r settings_to_dictr.s/&n"   r c0tj||}|S)zCall pylve.lve_lvp_setup directly, bypassing the lveapi wrapper. The lveapi wrapper iterates /proc/lve/resellers/ which doesn't exist for nested domain LVPs (they are leaf containers).)r lve_lvp_setup) domain_idrrcs r lvp_setup_directr$9s  Y 1 1B Ir ) __doc__lve_utils.pylve_wrapperr exceptionsrr ImportErrorr rrr$r r r*s 98)))))) LLLL EEE       s