$mԦ ddlmZddlmZmZmZmZmZddlm Z ddl m Z ddl m Z edgdZed gdZed d d d d d d d Zd ZGd d Zd S)) namedtuple)TupleOptionalTypeListIterator)etree)ClPwd)get_xml_config_etreeLimitscpuncpuiovmempmemnprocepiopsInheritedLimitsNrootceZdZdZddZdZdZeefdZ e dZ dZ e fd Zd Zd Zd Zd ZdZdZdZdS)XmlConfigReadera5 This class parses our xml into user-friendly primitive structures (dicts, tuples, namedtuples) This class may do: - data conversion (cpu & ncpu in config -> speed) - validation This class should NOT: - take care of user/package/reseller existence - write anything to xml Nct|_|t|_n||_t ||_t ||_t | |_ t | |_ dSN) r clpwdr _xml_configdict _users_limits _users_map_packages_limits _packages_map_resellers_limits_resellers_limits_map_resellers_defaults_resellers_defaults_map)self_xml_config_etrees !py/clveconfig/ve_config_reader.py__init__zXmlConfigReader.__init__*sWW  $355D  0D t113344!$"7"7"9"9::%)$*@*@*B*B%C%C"'+D,D,D,F,F'G'G$$$cZt|jdjS)Nversion)intrfindtextr(s r*r.zXmlConfigReader.version8s$4#((338999r,c\||jdS)Ndefaults)_parse_limits_sectionrr0r2s r*r4zXmlConfigReader.defaults<s.))   ! !* - -// /r,cx ||\}||S#ttf$rYdSwxYwr)xpathAttributeError ValueError)elementr7type_values r*_get_attribute_by_xpath_or_nonez/XmlConfigReader._get_attribute_by_xpath_or_noneAsO ]]5))FE5<<  +   44 s !$99c |t||dt||d||d||d||d||d||d||d S) Nz cpu/@limitz ncpu/@limitz io/@limitz mem/@limitz pmem/@limitz nproc/@limitzother/@maxentryprocsz iops/@limitr)r r=str)clsr:s r*r5z%XmlConfigReader._parse_limits_sectionJs33G\3OO44WmLL227KHH44WlKK44WmLL55g~NN227A\   [  ,,,.>5555666444"<<<!!!#####r,r) collectionsrtypingrrrrrlxmlr clcommon.clpwdr ve_configr r r EMPTY_LIMITSr_rrkr,r*rrs#"""""88888888888888 ++++++ HZZZ [ [*.0l0l0lmmv$dD$d {#{#{#{#{#{#{#{#{#{#r,