o nnh&@sddlmZddlmZmZddlmZddlmZddl m Z ddl m Z ddlmZmZddlmZdd lmZeZdd d ZGdddeZGdddZdS)) annotations)MappingMutableMapping)Enum)chain) constants) AnsibleError) to_nativeto_text)Display) combine_vars_FcCsd}|rEtj|}|rEdtt|t|f}tjdvs|r7tj||}|s6tjdks6td|d}ntjdkrEtd|d }|rLt ||S) Nz,invalid character(s) "%s" in group name (%s))neverignoresilentlyz Replacing zaInvalid characters were found in group names and automatically replaced, use -vvvv to see detailsrzNot replacing %szWInvalid characters were found in group names but not replaced, use -vvvv to see details) CINVALID_VARIABLE_NAMESfindallr setTRANSFORM_INVALID_GROUP_CHARSsubdisplayvvvvwarning)namereplacerforcesilentwarn invalid_charsmsgr"B/usr/local/lib/python3.10/dist-packages/ansible/inventory/group.pyto_safe_group_name s"   r$c@seZdZdZdZdS)InventoryObjectTyperN)__name__ __module__ __qualname__HOSTGROUPr"r"r"r#r%8sr%c@seZdZdZejZd0ddZddZddZ d d Z d d Z d dZ ddZ d1ddZddZddZeddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/ZdS)2Groupz a group of ansible hosts NcCs>d|_t||_g|_d|_i|_g|_g|_d|_d|_ dS)Nrr&) depthr$rhosts_hostsvars child_groups parent_groups _hosts_cachepriority)selfrr"r"r#__init__Cs  zGroup.__init__cC|SNget_namer5r"r"r#__repr__OzGroup.__repr__cCr7r8r9r;r"r"r#__str__Rr=z Group.__str__cCr7r8) serializer;r"r"r# __getstate__Ur=zGroup.__getstate__cCs ||Sr8) deserialize)r5datar"r"r# __setstate__X zGroup.__setstate__cCsFg}|jD] }||qd|_t|j|j||j|j d}|S)N)rr0r2r-r.) r2appendr?r/dictrr0copyr-r.)r5r2parentresultr"r"r#r?[s zGroup.serializecCs|||d|_|dt|_|dd|_|dg|_d|_|dg}|D]}t}| ||j |q+dS)Nrr0r-rr.r2) r6getrrFr0r-r.r/r,rAr2rE)r5rBr2 parent_datagr"r"r#rAls   zGroup.deserializeFc stg}tt|}|r|||r#|r|gng}|t||rV||tg}tfdd|DD]}|||rL||vrL||q:|||}|s%|rZ|S|S)a Given `rel` that is an iterable property of Group, consitituting a directed acyclic graph among all groups, Returns a set of all groups in full tree A B C | / | / | / | / D -> E | / vertical connections | / are directed upward F Called on F, returns set of (A, B, C, D, E) c3s|]}t|VqdSr8)getattr.0rLrelr"r# sz+Group._walk_relationship..) rrMaddextendupdater from_iterablerEdifference_update) r5rQ include_selfpreserve_orderingseen unprocessedorderednew_unprocessednew_itemr"rPr#_walk_relationshipzs,      zGroup._walk_relationshipcCs |dS)Nr2r_r;r"r"r# get_ancestorsrDzGroup.get_ancestorscKs|jdi|S)Nr1)r1r`)r5kwargsr"r"r#get_descendantsszGroup.get_descendantscCs|jdur t|j|_|jSr8)r/rr.r;r"r"r# host_namess  zGroup.host_namescCs|jSr8rr;r"r"r#r:szGroup.get_namecCsd}||kr td||jvrl|}|}||vr)tdt|jt|jf||||d}|j|t |j d|j g|_ | |jdd|j Dvrh|j || D]}|j|dq_||S) NFzcan't add group to itselfzGAdding group '%s' as child to '%s' creates a recursive dependency loop.Tr&cSsg|]}|jqSr"rerNr"r"r# sz)Group.add_child_group..) additions) Exceptionr1rarr rrSrWrEmaxr-_check_children_depthr2 get_hostspopulate_ancestorsclear_hosts_cache)r5groupaddedstart_ancestors new_ancestorshr"r"r#add_child_groups(      zGroup.add_child_groupcCs|j}|j}tg}t|j}|rJ|||d7}|}tg}|D]}|j|kr4||_||jq$||t|krFtdt|j|sdSdS)Nr&z5The group named '%s' has a recursive dependency loop.) r-rr1rUrGlenrr r)r5r- start_depthrZr[ to_processrLr"r"r#rjs"     zGroup._check_children_depthcCsDd}|j|jvr |j||j|j|||d}|SNFT)rrdr.rEr/rS add_grouprm)r5hostror"r"r#add_host   zGroup.add_hostcCsDd}|j|jvr |j||j|j|||d}|Srw)rrdr.remover/ remove_grouprm)r5ryremovedr"r"r# remove_hostr{zGroup.remove_hostcCsb|dkr |t|dS||jvr*t|j|tr*t|tr*t|j||i|_dS||j|<dS)Nansible_group_priority) set_priorityintr0 isinstancerrr )r5keyvaluer"r"r# set_variables $zGroup.set_variablecCsd|_|D]}d|_qdSr8)r3ra)r5rLr"r"r#rms zGroup.clear_hosts_cachecCs|jdur ||_|jSr8)r3 _get_hostsr;r"r"r#rk s  zGroup.get_hostscCs\g}i}|jdddD] }|j}|D]}||vr*d||<|jdkr%|jr%q||qq |S)NT)rXrYr&all)rcr.rimplicitrE)r5r.rZkid kid_hostskkr"r"r#rs zGroup._get_hostscCs |jSr8)r0rGr;r"r"r#get_varsrDzGroup.get_varscCs&zt||_WdStyYdSwr8)rr4 TypeError)r5r4r"r"r#r!s  zGroup.set_priorityr8)FF)r'r(r)__doc__r%r+ base_typer6r<r>r@rCr?rAr_rarcpropertyrdr:rsrjrzrrrmrkrrrr"r"r"r#r,=s4   ' #    r,N)r FF) __future__rcollections.abcrrenumr itertoolsransiblerransible.errorsr+ansible.module_utils.common.text.convertersr r ansible.utils.displayr ansible.utils.varsr rr$r%r,r"r"r"r#s