)dZddlZddlZddlZddlmZddlmZ ddlZ n #e $rdZ YnwxYweZ dZ Gdde ZGdd ZdS) upylve C-binding wrapper and related types. This module wraps the pylve C extension (PyLve, PyLveError) and lives outside lveapi deliberately: websiteisolation.* is imported by lveapi at the top level, so any websiteisolation sub-module that needs PyLve or PyLveError must not import from lveapi — that would form a cycle. Placing these types here breaks the cycle; lveapi re-exports them for backward compatibility. N)ProcLve)uid_maxiceZdZdS) PyLveErrorN)__name__ __module__ __qualname__py/lve_utils/pylve_wrapper.pyrr#sDr rceZdZdZedZdZdZdZe dddfd Z d Z d Z d Z d ZdZeefdZejdZdS)PyLvezA Wrapper for generate traceback with pretty descriptions cZt|to|tj ko|dkS)Nr) isinstanceinterrnoENOSYS)codes r _code_is_errorzPyLve._code_is_error+s)$$$L%,)>L419Lr ct|jjr5dfdt D}d|d}nt }|S)N, cdg|],}|d|dt|-S)_=) startswithgetattr).0attrarg_vars r z%PyLve._arg_to_str..2sFiiiTXTcTcdgThThiD3377D1133iiir z)r_pylveliblve_settingsjoindirstr)selfrliblve_settings_attr arg_var_strs ` r _arg_to_strzPyLve._arg_to_str/sr gt{: ; ; '#'99iiiiG iii$$ M5ILLLKKg,,Kr c |dj}|dj}||i|}|}|r=jr6t jj||i|}|}||j|j d ttj |fd|Dzd}jdkrt!jjdi|jdkrj|s|r|jdi|} t+| |S) Nerr_msg ignore_errorrcJg|]\}}|d| S)r)r*)rkvr's r r z&PyLve._wrapped_fun..Hs9XXXA1 < .funTs&$4$T;D;;;F;; ;r r )r'rErPs`` r _wrap_codezPyLve._wrap_codeSs' < < < < < < r Tg?rc||_|jdkrtd|_d|_d|_d|_||_||_t|_ ||_ |j |_ |jj |_ ||jj|_|jj|_||jj|_||jj|_|jj|_||jj|_||jj|_||jj|_||jj|_||jj|_t3|dr||jj|_||jj|_||jj|_||jj|_||j|_t3|dr&||jj|_dSdS)Nr5rCz/Error code {code}; {module}.{fun_name}({args_})zBDEBUG [lvectl]: call {module}.{fun_name}({args_}) with code {code}Flve_lvp_createlve_lvp_create2) r? __import__rCr7rAr-r"r8r_procr;lve_get_api_version api_version initializerQ lve_startr# lve_create lve_destroylve_infolve_set_default lve_setup lve_enter_pidlve_enter_pid_flags lve_leave_pidhasattrrSlve_lvp_destroy lve_lvp_map lve_lvp_move lve_lvp_setuprT)r'pylveretry retry_tymer?s r __init__zPyLve.__init__Xs, :??' 44DN$U!"f!  YY %;::<<+0)>??#{://$+*@AA??4;+BCC , #t{/JKK)>??!__T[-FGG#'??4;3R#S#S !__T[-FGG 5* + + E"&//$+2L"M"MD #'??4;3N#O#OD #t{/FGGD  $ 0H I ID "&1C!D!DD  5+ , , P#'??4;3N#O#OD  P Pr c,t|jdS)zB Check in pylve binding reseller limits supported rS)rcr")r's r resellers_supportedzPyLve.resellers_supported{st{$4555r cxt|jdsdS|j\}}||fdkS)a Check if per-domain limits via hierarchical LVP (lve_lvp_create2) are supported by both the installed library and the running kernel module. liblve and lve-kmod may be at different versions when one is updated without rebooting. lve_lvp_create2 requires kernel module API >= 1.7. After pylve.initialize(), lve_kapi_ver() returns the API version that kapi_init() negotiated with the running kernel. rTF)r4)rcr" lve_kapi_ver)r' kapi_major kapi_minors r domains_supportedzPyLve.domains_supportedsFt{$566 5!%!9!9!;!; JJ'611r cT ||dS#t$rYdSwxYw)zD Check if lve exists in kernel :rtype: bool TF)r]OSError)r'lve_ids r lve_existszPyLve.lve_existss@   MM& ! ! !4   55 s  ''cP|dkr|j||Si}t}|j|D]} ||}|||<|jptd}||jkrZ||}t||j|_| ||| |#t$rYwxYw| |jj} | ||d} |j|D]i}||vr:||} ||vr| || || || @| |||j| S)a~ Wrapper for lve_lvp_setup. When a LVP's limits change (reseller or domain-isolated user), we must iterate over child LVEs, temporarily reduce any that exceed the new parent limit, set the LVP, then restore the original child limits. This is needed because the kernel does not update child LVE limits when the parent LVP limit changes (KMODLVE-79) and rejects the call when any child exceeds the new parent limit. :param int lvp_id: top level container ID, 0 by default; :param settings: liblve_settings instance. :return: 0 or errno value rinfTr-)r"rgsetrV lve_id_listr]ls_cpufloatminr_addrurQ_invalidate_child_cpu) r'lvp_idsettingsreal_lve_settingsreduced_childrenrv real_settings child_cpu temp_settings_lve_lvp_setupresultreals r rgzPyLve.lve_lvp_setups" Q;;;,,VX>> >#% #j,,V44  F  $ f 5 5 ,9!&) *0@E%LL x..$(MM&$9$9M+.y(/+J+JM(NN6=999$((000     )BCCtDDDj,,V44 > >F***(0!111..vtXFFFvt,,,, vt}}V'<'<==== sBC%% C21C2c||}|j|jkr |j|_ntd|jdz |_|||dS)aForce the kernel to re-apply a child's CPU cgroup value. Sets CPU to a value different from the child's current lve_limits so that the subsequent lve_setup with the real value is not treated as a no-op by lve_resources_setup(). r4N)r]r}maxr_)r'rvrparent_settingsbumps r rzPyLve._invalidate_child_cpusd}}V$$ ;/0 0 0)0DKKa!7!!;<>c#XK||jc|_} dV||_dS#||_wxYwrOrz)r'r-saved_ignore_errors r context_ignore_errorzPyLve.context_ignore_errorsJ0O-- 3 EEE 2D    2D  2 2 2 2s )N)rrr __doc__ staticmethodrr*rLrQ _pylve_modulerkrmrsrwrgrUID_MAX MAX_LVE_IDr contextlibcontextmanagerrr r r rr'sMM\M4 +$3a!P!P!P!PF666 222   FFFP % % %*1z P P P P33333r r)rrrr9clcommon.clprocrclcommon.clfuncrrhr ImportErrorrr Exceptionrrr r r rs ############!!!!!MMM '))         a3a3a3a3a3a3a3a3a3a3s !++