a )gA@sddlmZmZmZeZddlmZddl m Z ddl m Z m Z ddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZGd d d eeeeZdS))absolute_importdivisionprint_functionN)AnsibleParserError)FieldAttributeNonInheritableFieldAttribute)Base) Conditional)CollectionSearch)load_list_of_tasks)Role)Taggable)Sentinelcs2eZdZededZededZededZeddZ eddZ eddZ d8fdd Z d d Z d d ZddZddZed9ddZeddZfddZddZddZddZddZeZd d!Zd:fd"d# Zd$d%Zd&d'Zd(d)Zd;d*d+Zd,d-Z d.d/Z!d0d1Z"d2d3Z#d4d5Z$d6d7Z%Z&S)<Blocklist)isadefault)rstringboolNFcsL||_||_d|_d|_||_||_|r0||_n |r:||_tt|dSN) _play_role_parent _dep_chain _use_handlersZ _implicitsuperr__init__)selfplay parent_blockrole task_include use_handlersimplicit __class__:/usr/lib/python3.9/site-packages/ansible/playbook/block.pyr2szBlock.__init__cCsd|jt||jfS)Nz BLOCK(uuid=%s)(id=%s)(parent=%s))_uuididrrr&r&r'__repr__AszBlock.__repr__cCs |j|jkSz object comparison based on _uuidr(rotherr&r&r'__eq__Dsz Block.__eq__cCs |j|jkSr,r-r.r&r&r'__ne__Hsz Block.__ne__cCs*i}|jr||jO}||jO}|S)z Blocks do not store variables directly, however they may be a member of a role or task include which does, so return those if present. )rget_varsvarscopyrall_varsr&r&r'r2Ls zBlock.get_varsc Cs0t| }t||||||d} | j|||dS)N)rrr r!r"r#)variable_managerloader)ris_blockZ load_data) datarrr r!r"r7r8r#br&r&r'load[s z Block.loadcCs,d}t|tr(dD]}||vrd}q(q|S)NFblockrescuealwaysT) isinstancedict)dsr9attrr&r&r'r9as zBlock.is_blockcsRt|sBt|tr*tt|t|dStt|t|gdStt||S)z If a simple task is given, an implicit block for that single task is created, which goes in the main portion of the block )r>)rr9rArrpreprocess_datarB)rrCr$r&r'rEks   zBlock.preprocess_datac Cs^z$t||j||jd|j|j|jdWStyX}ztd|j|dWYd}~n d}~00dS)Nrr>r r!r7r8r"z7A malformed block was encountered while loading a blockobjZorig_exc r rrZ_variable_manager_loaderrAssertionErrorr_dsrrDrCer&r&r' _load_blockys zBlock._load_blockc Cs^z$t||j||jd|j|j|jdWStyX}ztd|j|dWYd}~n d}~00dS)NrFz7A malformed block was encountered while loading rescue.rGrIrMr&r&r' _load_rescues zBlock._load_rescuec Cs^z$t||j||jd|j|j|jdWStyX}ztd|j|dWYd}~n d}~00dS)NrFz6A malformed block was encountered while loading alwaysrGrIrMr&r&r' _load_alwayss zBlock._load_alwayscCs |r|jstd||jddS)Nz+'%s' keyword cannot be used without 'block')rH)r>rrL)rrDnamevaluer&r&r'_validate_alwayss zBlock._validate_alwayscCs2|jdur |jr|jSdSn|jddSdSr)rr get_dep_chainr*r&r&r'rUs   zBlock.get_dep_chaincsdd}tt|}|j|_|j|_|jdur@|jdd|_d|_|jr`|s`|jjdd|_|s||jpng||_||jpg||_||j pg||_ d|_ |j r|j |_ | |S)NcSs|g}|D]n}|jdd}|jrf|jjdd|_|j|kr@||_ql|j}|jr^|j|kr^|j}qF||_n||_||q|S)NT)exclude_parent exclude_tasks)r4rappend)Z task_list new_blockZ new_task_listtaskZnew_taskZcur_objr&r&r'_dupe_task_lists   z#Block.copy.._dupe_task_listTrW) rrr4rrrrr>r?r@rZvalidate)rrVrXr\Znew_mer$r&r'r4s$  z Block.copycCs~t}|jD]}|dvr t||||<q ||d<|jdurL|j|d<|jdurz|jjdd|d<|jjj |d<|S) z Override of the default serialize method, since when we're serializing a task we don't want to include the attribute list of tasks. r= dep_chainNr TrWparent parent_type) rB fattributesgetattrrUr serializerr4r%__name__)rr:rDr&r&r'rbs    zBlock.serializec Csddlm}ddlm}|jD]&}||vr|dvrt||||q|dd|_|d}|rxt}| |||_ |d}|r|d }|d krt } n|d kr|} n|d kr|} | || |_ |j |_dS) zt Override of the default deserialize method, to match the above overridden serialize method r TaskInclude)HandlerTaskIncluder=r]Nr r^r_rrerf)ansible.playbook.task_includereZ%ansible.playbook.handler_task_includerfr`setattrgetrr deserializerrrrU) rr:rerfrDZ role_datarZ parent_datar_pr&r&r'rjs.        zBlock.deserializecCsP||_|jr|j|n|jr,|j||}|rL|D]}||q.evaluate_and_append_taskcs>|jddd}|j|_|j|_|j|_|j|_|S)NT)rVrX)r4rr>r?r@)r>rZr~r&r'r}s    z1Block.filter_tagged_tasks..evaluate_blockr&r5r&)r6r~r}rr'filter_tagged_tasksrs zBlock.filter_tagged_taskscs fddfdd|S)Ncs6g}|D](}t|tr&||q||q|Sr)rArrrrY)r{r|r[)r}r&r'r~s   z1Block.get_tasks..evaluate_and_append_taskcs.|j}||j||j|Sr)r>rrr?r@)r>rvrr&r'r}s z'Block.get_tasks..evaluate_blockr&r*r&)r~r}r' get_taskss zBlock.get_taskscCs*t|jdkp(t|jdkp(t|jdkS)Nr)lenr>r?r@r*r&r&r'rxszBlock.has_taskscCs|jr|jStSdSr)rget_include_paramsrBr*r&r&r'rs zBlock.get_include_paramscCs8ddlm}|jr4t|j|r*|jjs*dS|jSdS)a7 Determine if all of the parents of this block were statically loaded or not. Since Task/TaskInclude objects may be in the chain, they simply call their parents all_parents_static() method. Only Block objects in the chain check the statically_loaded value of the parent. rrdFT)rgrerrArpall_parents_staticrrer&r&r'rs   zBlock.all_parents_staticcCs2ddlm}|jr.t|j|r$|jS|jSdS)Nrrd)rgrerrAget_first_parent_includerr&r&r'rs    zBlock.get_first_parent_include)NNNNFF)NNNNFNN)FF)F)'rc __module__ __qualname__rrr>r?r@rnotifyZ delegate_toZdelegate_factsrr+r0r1r2 staticmethodr<r9rErOrPrQrTZ_validate_rescuerUr4rbrjrmrqrrrxrrr __classcell__r&r&r$r'r"sB         -& Ir)Z __future__rrrtypeZ __metaclass__Zansible.constantsZ constantsrzZansible.errorsrZansible.playbook.attributerrZansible.playbook.baserZansible.playbook.conditionalr Z!ansible.playbook.collectionsearchr Zansible.playbook.helpersr Zansible.playbook.roler Zansible.playbook.taggabler Zansible.utils.sentinelrrr&r&r&r's