a ì)gƒOã@sÆddlmZmZmZeZdZddlmZ ddl m Z m Z m Z ddlmZmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lm Z e ƒZ!Gdd„deƒZ"dS)é)Úabsolute_importÚdivisionÚprint_functiona name: linear short_description: Executes tasks in a linear fashion description: - Task execution is in lockstep per host batch as defined by C(serial) (default all). Up to the fork limit of hosts will execute each task at the same time and then the next series of hosts until the batch is done, before going on to the next task. version_added: "2.0" notes: - This was the default Ansible behaviour before 'strategy plugins' were introduced in 2.0. author: Ansible Core Team )Ú constants)Ú AnsibleErrorÚAnsibleAssertionErrorÚAnsibleParserError)ÚIteratingStatesÚ FailedStates)Úto_text)ÚHandler)Ú IncludedFile)ÚTask)Ú action_loader)Ú StrategyBase)ÚTemplar)ÚDisplaycs0eZdZ‡fdd„Zdd„Z‡fdd„Z‡ZS)ÚStrategyModulecstƒj|i|¤Žd|_dS)NF)ÚsuperÚ__init__Ú _in_handlers)ÚselfÚargsÚkwargs©Ú __class__©úC/usr/lib/python3.9/site-packages/ansible/plugins/strategy/linear.pyr3szStrategyModule.__init__c CsØtƒ}d|_d|jd<d|_| |jj¡i}|D]*}|j|dd\}}|dur2||f||<q2|spdd„|DƒS|jrœt t d d „d d „|  ¡Dƒƒƒsœd |_|jrºt dd „|  ¡Dƒƒ}nzdd„|  ¡Dƒ} d} | dkr,z|j |j} Wn"ty d|_| d7} YqÐ0|jd7_| j| vrÐq4qÐtdƒ‚g} | ¡D]d\}\}}|jr`||jksv|js”| j|jkr”| |j|¡|  ||f¡n|  ||f¡q@|jsÔ| jtjvrÔ| j d¡dkrÔd|_| S)zž Returns a list of (host, task) tuples, where the task may be a noop task to keep the iterator in lock step across all hosts. ÚmetaÚnoopÚ _raw_paramsT©ÚpeekNcSsg|] }|df‘qS©Nr)Ú.0ÚhrrrÚ Lóz:StrategyModule._get_next_task_lockstep..cSs |tjkSr#)r ÚHANDLERS)ZrsrrrÚOr'z8StrategyModule._get_next_task_lockstep..css|]\}}|jVqdSr#)Ú run_state)r$ÚsÚ_rrrÚ Pr'z9StrategyModule._get_next_task_lockstep..Fcss$|]\}}|jtjkr|jVqdSr#)r*r r(Úcur_handlers_task©r$r+Útrrrr-Us ÿcSsg|]\}}|j‘qSr)Ú_uuidr/rrrr&Zr'rézOBUG: There seems to be a mismatch between tasks in PlayIterator and HostStates.Úflush_handlers)rÚactionrZimplicitÚ set_loaderÚ_playÚ_loaderÚget_next_task_for_hostrÚanyÚfilterÚvaluesÚminÚ all_tasksÚcur_taskÚ IndexErrorr1rÚitemsr.Zset_state_for_hostÚnameÚappendÚCÚ _ACTION_METAÚget) rÚhostsÚiteratorZ noop_taskZstate_task_per_hostÚhostÚstateÚtaskZlowest_cur_handlerZ task_uuidsZ _loop_cntr>Ú host_tasksrrrÚ_get_next_task_lockstep9sd  þÿ   ÿÿ ÿÿz&StrategyModule._get_next_task_lockstepc( sŽ|jj}d}| |j¡|rz|jjszz t d¡| |¡}t d¡d}d}| ||¡}d}d} d} g} |D]¾\} } | s‚qr|jjrq4d}d}t | t ƒsâ| j râ| j   | ¡râ| j j dusÒ| j j râ| j j jsât d| ¡qrt d¡|jj|j| | |j|jd}|j||jd t|j|d }t d ¡| | j¡}ztj|d| jd }Wntyjd}Yn0|tjvrÄ|  | | ||| ¡¡| j  d d¡dvr¦d}| j!s´|rü| j"süd} n8|j#rî| rî| $| ¡räd} n d}q4| | j%¡p |o t&|ddƒ}| j!s|r(| j"s(d} |sÜt d¡| j'}t d¡z(t(|j| j'dddd| _'t d¡Wnt)yŽt d¡Yn0t d¡t | t ƒr¶|j *d| ¡n|jj*d| dd|| _'d}t d¡d|j+|  ,¡<| -| | ||¡~|rq4|  |j.|t/dt0t1|jj2ƒdƒƒd¡qr|r>Wqt d¡|j3d krd|  | 4|¡¡| 5| ¡t6j7| ||j|jd!}t1|ƒd krt d"¡t d#¡t8d$d%„|Dƒƒ}t d&¡g}t9ƒ}|D]À}t d'|j:¡d}z|j;r| <|¡}|j=|j|j|jd(\}}nt |j>t ƒ}|j?|||d)}d*d+„|jj@Dƒ|_@t d,¡|D] }|rˆ|jAD]} |jBdd…| _Cqj|}nJ|jj|j| D¡|j|jd-}t d.¡| E|¡}t d/¡| | F¡¡|D] } | |jBvrÖ||  G|¡qÖqZt d0¡Wn†tHy‚YnrtIyŽ}zX|j;rHtjJt(|ƒdd1|jKD]} d| jLd2<| M| jN¡qNWYd}~qÐWYd}~n d}~00qÐ|D]} d|jjO| j'<| P| ¡q˜t d3¡|D]} | Q| || ¡qÆ||jR|jS|jS…<t d4¡t d5¡t d6¡t d7¡g}!g}"| D]V}#|# T¡sB|#j>jtjvr`| T|#jN¡r`|! G|#jNj'¡n|# U¡r$|" G|#jNj'¡q$| rt1|!ƒd ksžt1|"ƒd krtVtWjXtWjYgƒ}$|D]h} |jZ| dd8\}%}&| [|%¡}%|%j\|$vsþ|%j\tWjXkr²|%j]t^jX@d kr²d|jjO| j'<||jj_O}q²t d9¡t d:¡|jj`durÖt1| ƒd krÖ|jj`d;}'t1|jjOƒ|ja|'kr¸|D]*} | j'|!vrtd|jjO| j'<| P| ¡qt|j *d<¡||jj_O}t d=t1|jjOƒ|ja|'f¡t d>¡t d?¡||jjkr*t1|jjOƒt1|ƒkr*t d@¡|j *d<¡|WSt dA¡Wqtbtcfyv}z"t dB|¡|jjdWYd}~Sd}~00qtetf|ƒ g|||¡S)Cz² The linear strategy is simple - get the next task and queue it for all hosts, then wait for the queue to drain before moving on to the next task Tz)getting the remaining hosts for this loopz.done getting the remaining hosts for this loopFNz)'%s' skipped because role has already runzgetting variables)ÚplayrHrJÚ_hostsÚ _hosts_all)rM)ÚloaderZ variableszdone getting variables)Z class_onlyZcollection_listr )rZreset_connectionZend_hostZ role_completer3ZBYPASS_HOST_LOOPzOsending task start callback, copying the task so we can template it temporarilyz#done copying, going to template now)Zfail_on_undefinedÚempty)Z nonstringzdone templatingz!templating failed for some reasonzhere goes the callback...Z!v2_playbook_on_handler_task_startZv2_playbook_on_task_start)Zis_conditionalzsending task start callbackr2gš™™™™™¹?)Z max_passesz>done queuing things up, now waiting for results queue to drainr)rGrPÚvariable_managerz!we have included files to processzgenerating all_blocks datacss|]}|gfVqdSr#r)r$rHrrrr-r'z%StrategyModule.run..zdone generating all_blocks datazprocessing included file: %s)rMrRrP)rGÚ is_handlercSsg|]}|jD]}|‘qqSr)Úblock)r$Úbr%rrrr&'r'z&StrategyModule.run..z2iterating over new_blocks loaded from include file)rMrJrNrOzfiltering new block on tagsz done filtering new block on tagsz7done iterating over new_blocks loaded from include file)Z wrap_textZfailedz7extending task lists for all hosts with included blockszdone extending task listszdone processing included fileszresults queue emptyzchecking for any_errors_fatalr!z"done checking for any_errors_fatalz checking for max_fail_percentagegY@Z!v2_playbook_on_no_hosts_remainingz$(%s failed / %s total )> %s max failz%done checking for max_fail_percentagezIchecking to see if all hosts have failed and the running result is not okz!^ not ok, so returning result nowz-done checking to see if all hosts have failedz%got IOError/EOFError in task loop: %s)hZ_tqmZRUN_OKZ_set_hosts_cacher6Z _terminatedÚdisplayÚdebugZget_hosts_leftrLÚ isinstancer Z_roleZhas_runZ _metadataZallow_duplicatesZ_variable_managerZget_varsZ _hosts_cacheZ_hosts_cache_allZadd_tqm_variablesrr7Útemplater4rrEÚ collectionsÚKeyErrorrCrDÚextendZ _execute_metarÚany_errors_fatalÚ ignore_errorsZ_stepZ _take_stepÚrun_onceÚgetattrrAr Ú ExceptionZ send_callbackZ_blocked_hostsZget_nameZ _queue_taskZ_process_pending_resultsÚmaxÚintÚlenZ_workersZ_pending_resultsZ_wait_on_pending_resultsZupdate_active_connectionsr Zprocess_include_resultsÚdictÚsetZ _filenameZ_is_roleZ_copy_included_fileZget_block_listZ_taskZ_load_included_fileÚhandlersrTrNZnotified_hostsZget_first_parent_includeZfilter_tagged_tasksZ get_tasksrBrrÚerrorZ_resultsZ_resultÚaddZ_hostZ _failed_hostsZmark_host_failedZ add_tasksr=r>Z is_failedZis_unreachableÚ frozensetr ZRESCUEZALWAYSr8Zget_active_stater*Z fail_stater ZRUN_FAILED_BREAK_PLAYZmax_fail_percentageZ batch_sizeÚIOErrorÚEOFErrorZRUN_UNKNOWN_ERRORrrÚrun)(rrGZ play_contextÚresultZ work_to_doZ hosts_leftZ callback_sentrKZ skip_restZ choose_stepr]ÚresultsrHrJr_Z task_varsZtemplarZ task_actionr4Z saved_nameZincluded_filesZ all_blocksZincluded_tasksZfailed_includes_hostsZ included_filerSZnew_irZ new_blocksZhandler_blocksZ new_blockZ final_blockÚeÚrZ failed_hostsZunreachable_hostsÚresZdont_fail_statesr+r,Z percentagerrrrmsz      ÿ           ,   ü     ý    ü      (     ( "   ÿÿ        $   zStrategyModule.run)Ú__name__Ú __module__Ú __qualname__rrLrmÚ __classcell__rrrrr1s FrN)#Z __future__rrrÚtypeZ __metaclass__Z DOCUMENTATIONZansiblerrCZansible.errorsrrrZansible.executor.play_iteratorr r Zansible.module_utils._textr Zansible.playbook.handlerr Zansible.playbook.included_filer Zansible.playbook.taskrZansible.plugins.loaderrZansible.plugins.strategyrZansible.templaterZansible.utils.displayrrVrrrrrÚs