a )g@sZddlmZmZmZeZddlZddlZddlZddl m Z ddl m Z ddl mZddlmZddlmZddlmZmZmZmZdd lmZdd lmZdd lmZmZdd lm Z dd l!m"Z"m#Z#m$Z$m%Z%ddl&m'Z'm(Z(ddl)m*Z*m+Z+ddl,m-Z-ddl.m/Z/ddl0m1Z1m2Z2m3Z3e-Z4ddZ5GdddZ6GdddZ7Gddde7Z8dS))absolute_importdivisionprint_functionN)copy)cache)UndefinedError) constants)context) AnsibleErrorAnsibleParserErrorAnsibleUndefinedVariableAnsibleAssertionError) string_types)boolean)to_text to_native) DataLoader) AttributeFieldAttributeConnectionFieldAttributeNonInheritableFieldAttribute) module_loader action_loader)_get_collection_metadataAnsibleCollectionRef)DisplaySentinel) combine_vars isidentifier get_unique_idc Csvdttfddi}g}tj}t|to8d|vo8t|dk}|rh|shdtt|}| dj |dn|rJ|r|| d t|dts| d j |dd nt |d t | }|r| d d|g} | D]H\} } | |dvrq|d| } t| | d s| d| | | dfq| rJ| d d| |rr|dd |td|dS)N extend_grouplist)types errortypemetadata, z7The only expected key is metadata, but got keys: {keys})keysz-The group contains multiple metadata entries.z0The metadata is not a dictionary. Got {metadata})r%z*The metadata contains unexpected keys: {0}r#z%s is %s (expected type %s)r$z/The metadata contains unexpected key types: {0}rzNInvalid metadata was found for action_group {0} while loading module_defaults. )r"rCZVALIDATE_ACTION_GROUP_METADATA isinstancedictlenjoinsortedappendformatsetr(itemsinsertdisplaywarning) actionfound_group_metadata fq_group_nameZvalid_metadataZmetadata_warningsvalidateZ metadata_onlyZ found_keysZunexpected_keysZunexpected_typesZfieldZ requirementvaluer<9/usr/lib/python3.9/site-packages/ansible/playbook/base.py_validate_action_group_metadata"s>   r>c@seZdZddZdddZdS)_ClassPropertycCs ||_dSN)name)selfownerrAr<r<r= __set_name__Jsz_ClassProperty.__set_name__NcCst|d|jS)N_)getattrrA)rBobjZobjtyper<r<r=__get__Msz_ClassProperty.__get__)N)__name__ __module__ __qualname__rDrHr<r<r<r=r?Isr?c@seZdZeZeeddZddZe ddZ d;dd Z d d Z dd d!Zd?d"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd@d1d2Zd3d4Zd5d6Z d7d8Z!d9d:Z"d S)AFieldAttributeBasecCsbi}t|jD]N}t|jD]:\}}t|ts4q |||<|jr t||j||||j<q q|Sr@) reversed__mro__r"__dict__r3r+raliassetattr)cls fattributesZ class_objrAattrr<r<r= _fattributesUs zFieldAttributeBase._fattributescCs2d|_d|_d|_d|_d|_t|_t|_dS)NF) _loader_variable_manager _validated _squashed _finalizedr _uuidr,varsrBr<r<r=__init__cszFieldAttributeBase.__init__cCs|jSr@)rZr]r<r<r= finalizeduszFieldAttributeBase.finalizedrcCs|dkrtdtdd||jj|t|ft|drz|jrz|j|d|j}|rz|D]}||dqft|dr|j r|j |ddS) zf this is never called from production code, it is here to be used when debugging as a 'complex print' rzEDUMPING OBJECT ------------------------------------------------------z%s- %s (%s, id=%s)r)_parent_playN) r5debug __class__rIidhasattrr`dump_me get_dep_chainrb)rBdepth dep_chainZdepr<r<r=rgys " zFieldAttributeBase.dump_mecCs|S)zD infrequently used method to do some pre-processing of legacy terms r<)rBdsr<r<r=preprocess_datasz"FieldAttributeBase.preprocess_dataNcCs|durtd|t|d|||_|dur6||_nt|_||}||t|j t ddD]L\}}||vrjt |d|d}|rt||||||qjt||||qj| |S)z4 walk the input datastructure and assign any values Nz%ds (%s) should not be None but it is._dsr&)keyz_load_%s)r rQrWrVrrl_validate_attributesr/rSr3operator itemgetterrFr:)rBrkZvariable_managerloaderrArTmethodr<r<r= load_datas"     zFieldAttributeBase.load_datacCs&z t|dWSty YdS0dS)Nrm)rFAttributeErrorr]r<r<r=get_dss  zFieldAttributeBase.get_dscCs|jSr@)rVr]r<r<r= get_loaderszFieldAttributeBase.get_loadercCs|jSr@)rWr]r<r<r=get_variable_managersz'FieldAttributeBase.get_variable_managercCsJ||}td}|rFt|trF||vrFtd|d|f|d|S)N)alwaysZ on_failedZon_unreachableZ on_skippedneverz9'%s' is not a valid value for debugger. Must be one of %sr'rG)template frozensetr+rr r.rv)rBrTr;templarZ valid_valuesr<r<r=_post_validate_debuggers  z*FieldAttributeBase._post_validate_debuggercCs8t|j}|D]$}||vrtd||jjf|dqdS)z} Ensures that there are no keys in the datastructure which do not map to attributes for this object. z&'%s' is not a valid attribute for a %sr{N)r}rSr rdrI)rBrkZ valid_attrsrnr<r<r=ros z'FieldAttributeBase._validate_attributescCs|dur in|}|js|jD]~\}}t|d|d}|rP|||t||q t|d|t}|dur |jdkr t|ttfr t d|t |f| dq d|_dS)z6 validation that is done at parse time, not load time Nz _validate_%srEstringz[The field '%s' is supposed to be a string type, however the incoming data structure is a %sr{T) rXrSr3rFrisar+r"r,r typerv)rBall_varsrA attributersr;r<r<r=r:s  zFieldAttributeBase.validatec Cs|dur dSt|ts|g}g}|D]}t|ts:tdi}|D]\}}|dr|dd}|jdur~||\}} d|}|||<qFt |ddkrd|}| |} | r||| <|drF|j | dddd } | rF||| <qF| |q$|S) NzThe field 'module_defaults' is supposed to be a dictionary or list of dictionaries, the keys of which must be static action, module, or group names. Only the values may contain templates. For example: {'ping': "{{ ping_defaults }}"}zgroup/.zansible.legacy.zansible.builtin.F mandatory) r+r"r,r r3 startswithsplitplay_resolve_groupr-_resolve_actionreplacer0) rBrAr;Zvalidated_module_defaultsZ defaults_dictZvalidated_defaults_dictZdefaults_entrydefaultsZ group_namedummyresolved_actionr<r<r=_load_module_defaultss@          z(FieldAttributeBase._load_module_defaultscCsJt|dr|j}n$t|dr2t|jdr2|jj}n|}|jjdkrFdS|S)Nrbr`ZPlay)rfrbr`rdrI)rBrr<r<r=r!s   zFieldAttributeBase.playTcCszt|sd}|d|}nd|ddd}||jjvrP||jj|fSzt|di}Wn<ty|st d||gfYSt d|Yn0||dd}||||}|dur|st d||gfSt d|g}g}d} |D]} t | t sjt| | |t | d trd } | d d g}t |t rV|g}t |tsg}qt| s|d| } |j| dd } | r|| q|D]2} | |jjvrg|jj| <|jj| |q||jj|<|D]} t| s|d| } |j| dd \} }|D]2} | |jjvrr,r"rr0_action_groupsrextend)rBr9rZcollection_namer resource_name action_groupZresolved_actionsZinclude_groupsr8r7rZ include_groupr group_actionsr<r<r=r0st                z!FieldAttributeBase._resolve_groupcCsjt|}|jr,|js,t|}|jr<|}n|js|durg}nt|ts|g}|j dur|D]p}t||j st d ||j |t |f| d q|j r|j tkr|dus$|d krt d |f| d qn|jdkr|dur\t}n.t|ttfst|tr|d}n|g}t|tst|}nv|jdkr|durt}nt|tstd|n>|jdkrt||js td||jt |f|j|d|S)NrintfloatboolT)strictpercent%r"z@the field '%s' should be a list of %s, but the item '%s' is a %sr{z8the field '%s' is required, and cannot have empty valuesr2,r,z%s is not a dictionaryclassz'%s is not a valid %s (got a %s instead))r~)rrrrrr+rrr"Zlistofr rrvrequiredstripr2rr, TypeError class_type post_validate)rBrArr;r~itemr<r<r=get_validated_values^                         z&FieldAttributeBase.get_validated_valuecCs`|j|}t|tr"t||tn:zt|||j|ddWntyZt||tYn0dS)z9 set to parent inherited value or Sentinel as appropriateT)omitN)rSr+rrQrZ_get_parent_attributeru)rBrArr<r<r=set_to_contexts   z!FieldAttributeBase.set_to_contextc Cs|jd}|jD]\}}|jrVt||}|dvr||rtd||fqt||dur||j snqqt d|n|j s|j j dvrqzt|d|d}|r||t|||}n&|jdkrt||}n|t||}|dur||kr||Wq|dur|||||}t|||Wqttfyz}z6t||}t d |||j|f||d WYd}~qd}~0ttfy}zX|jr|d kr|d krd t|}nd|t|f}t |||d WYd}~qd}~00qd|_dS)z we can't tell that everything is of the right type until we have all the variables. Run basic types (from isa) as well as any _post_validate_ functions. r)r\z]"%s" is not templatable, but we found: %s, it will not be templated and will be used "as is".Nz*the field '%s' is required but was not set)ZTaskZHandlerZ PlayContextz_post_validate_%srz_the field '%s' has an invalid value (%s), and could not be converted to an %s.The error was: %srGrrAargszIThe task includes an option with an undefined variable. The error was: %sz\The field '%s' has an invalid value, which includes an undefined variable. The error was: %sT)Zavailable_variablesrrSr3staticrFZ is_templater5r6rr always_post_validaterdrIrr|rrrQrrrvr rZ_fail_on_undefined_errorsrrZ) rBr~Z omit_valuerArr;rsrmsgr<r<r=rsT         *z FieldAttributeBase.post_validatec Csdd}zvt|tr*||t|j|WSt|trj|j}|D]$}t|tsPt||t||}q>|WS|durxiWStWnvty}z"td|jj||dWYd}~nFd}~0t y}z&td|jj|f||dWYd}~n d}~00dS)z Vars in a play can be specified either as a dictionary directly, or as a list of dictionaries. If the later, this method will turn the list into a single dictionary. cSs"|D]}t|std|qdS)Nz!'%s' is not a valid variable name)rr)rkrnr<r<r=_validate_variable_keysEsz>FieldAttributeBase._load_vars.._validate_variable_keysNzIVars in a %s must be specified as a dictionary, or a list of dictionariesrz2Invalid variable name in vars specified for %s: %s) r+r,rr\r"rr rdrIr)rBrTrkrrrrr<r<r= _load_vars>s,     zFieldAttributeBase._load_varsFcCsft|ts|g}t|ts |g}dd|D}dd|D}|rJ||}n||}ddt|DS)z Will extend the value given with new_value (and will turn both into lists if they are not so already). The values are run through a set to remove duplicate values. cSsg|]}|tur|qSr<r.0vr<r<r= oz4FieldAttributeBase._extend_value..cSsg|]}|tur|qSr<rrr<r<r=rprcSsg|]\}}|dur|qSr@r<)rirEr<r<r=rwr)r+r" itertoolsgroupby)rBr;Z new_valueprependZcombinedr<r<r= _extend_value`s   z FieldAttributeBase._extend_valuecCsPi}|jD]<\}}t||}|jdkrBt|drB|||<q|||<q|S)z6 Dumps all attributes to a dictionary r serialize)rSr3rFrrfr)rBattrsrArrTr<r<r= dump_attrsys  zFieldAttributeBase.dump_attrscCsv|D]\\}}||jvr|j|}|jdkrXt|trX|}||t|||qt|||qd|_d|_ dS)z4 Loads attributes from a dictionary rTN) r3rSrr+r,r deserializerQrZrY)rBrrTr;rrGr<r<r= from_attrss   zFieldAttributeBase.from_attrscCs*|}|j|d<|j|d<|j|d<|S)a0 Serializes the object derived from the base object into a dictionary of values. This only serializes the field attributes for the object, so this may need to be overridden for any classes which wish to add additional items not stored as field attributes. uuidr_squashed)rr[rZrY)rBreprr<r<r=rs    zFieldAttributeBase.serializecCst|tstd|t|f|jD],\}}||vrJt||||q(||q(t|d|d|dd|_ |dd|_ dS)z Given a dictionary of values, load up the field attributes for this object. As with serialize(), if there are any non-field attribute data members, this method will need to be overridden and extended. z&data (%s) should be a dict but is a %sr[rr_FrN) r+r,r rrSr3rQrrrZrY)rBdatarArr<r<r=rs  zFieldAttributeBase.deserialize)r)NN)N)T)T)F)#rIrJrKr?rS classmethodrrUr^propertyr_rgrlrtrvrwrxrror:rrrrrrrrrrrrrrrr<r<r<r=rLQs@    * 7  U  3E"  rLc@sjeZdZeddddZededdZe ddZ e ded dZ ed d dd Z e d dddZ e d dddZe dejdZe ddZe ddZe ddZe deddZe deddZe dejdZe dddZe dejdZe ddZe deddZe deddZe deddZe deddZ e deddZ!gZ"ddZ#ddZ$ddZ%dS)BaserrT)rdefaultr connection)rrr)r remote_userr,d)rpriorityrr")rrrrcheckdiffrbecome become_method become_user become_flags become_exec Cshd}zd|jj|jjf}WnFtybz d|jjjj|jjjjf}Wnty\Yn0Yn0|S)zE return the absolute path of the playbook object and its line number rz%s:%s)rmZ _data_sourceZ _line_numberrur`rb)rBpathr<r<r=get_paths    z Base.get_pathcCs"t|dr|jr|jSdSdS)Nr`)rfr`rhr]r<r<r=rhs zBase.get_dep_chaincCsNg}|}|r(|tdd|Dtj|}||vrJ|||S)z Return the list of paths you should search for files, in order. This follows role/playbook dependency chain. cSsg|]}t|dr|jqS) _role_path)rfr)rxr<r<r=r rz(Base.get_search_path..)rhrrMosrdirnamerr0)rBZ path_stackrjZtask_dirr<r<r=get_search_paths zBase.get_search_pathN)&rIrJrKrrArr Zcliargs_deferred_getrrportrr\Zmodule_defaultsZ environmentr*ZDEFAULT_NO_LOGZno_logZrun_once ignore_errorsZignore_unreachableZ check_moderZANY_ERRORS_FATALZany_errors_fatalZthrottleZ TASK_TIMEOUTtimeoutZdebuggerrrrrrZDEPRECATED_ATTRIBUTESrrhrr<r<r<r=rs4       r)9Z __future__rrrrZ __metaclass__rrprrr functoolsrZjinja2.exceptionsrZansiblerr*r Zansible.errorsr r r r Zansible.module_utils.sixrZ)ansible.module_utils.parsing.convert_boolrZansible.module_utils._textrrZansible.parsing.dataloaderrZansible.playbook.attributerrrrZansible.plugins.loaderrrZ2ansible.utils.collection_loader._collection_finderrrZansible.utils.displayrZansible.utils.sentinelrZansible.utils.varsrrr r5r>r?rLrr<r<r<r=s:          'w