a 'Dg$@sdZddlZddlZddlZddlZddlmZddlm Z ddl m Z m Z ddl mZdZdZd ZeeZGd d d eZed ZGd ddZGdddeZdddZejdfddZddZGdddZddZdS)z events for reporting. The events here are designed to be used with reporting. They can be published to registered handlers with report_event. N)List) performance)available_handlersinstantiated_handler_registry)ReportingHandlerZfinishstart cloudinitc@seZdZddZdS)_namesetcCs||vr |Std|dS)Nz%s not a valid value)AttributeError)selfnamer >/usr/lib/python3.9/site-packages/cloudinit/reporting/events.py __getattr__ sz_nameset.__getattr__N)__name__ __module__ __qualname__rr r r rr sr )SUCCESSWARNFAILc@s.eZdZdZedfddZddZddZdS) ReportingEventz"Encapsulation of event formatting.NcCs2||_||_||_||_|dur(t}||_dSN) event_typer descriptionorigintime timestamp)r rr rrrr r r__init__,szReportingEvent.__init__cCsd|j|j|jS)z"The event represented as a string.z {0}: {1}: {2})formatrr rr r r r as_string<s zReportingEvent.as_stringcCs|j|j|j|j|jdS)z&The event represented as a dictionary.r rrrrr!rr r ras_dictBs zReportingEvent.as_dict)rrr__doc__DEFAULT_EVENT_ORIGINrr r"r r r rr)s  rcs8eZdZejdffdd ZddZfddZZS)FinishReportingEventNcsDtt|t||||_|dur&g}||_|tvr@td|dS)NzInvalid result: %s)superr%rFINISH_EVENT_TYPEresult post_filesstatus ValueError)r r rr(r) __class__r rrNs zFinishReportingEvent.__init__cCsd|j|j|j|jS)Nz{0}: {1}: {2}: {3})rrr r(rrr r rr [szFinishReportingEvent.as_stringcs0tt|}|j|d<|jr,t|j|d<|S)z'The event represented as json friendly.r(files)r&r%r"r(r)_collect_file_info)r datar,r rr"`s  zFinishReportingEvent.as_dict) rrrr*rrr r" __classcell__r r r,rr%Ms r%csTsifddtjD}ttj}|D]}t||vrDq2||q2dS)aReport an event to all registered event handlers except those whose type is in excluded_handler_types. This should generally be called via one of the other functions in the reporting module. :param excluded_handler_types: List of handlers types to exclude from reporting the event to. :param event_type: The type of the event; this should be a constant from the reporting module. csh|]\}}|vr|qSr r ).0Z hndl_typeZhndl_clsexcluded_handler_typesr r yszreport_event..N)rZregistered_itemsitemslistrvaluestypeZ publish_event)eventr4Zexcluded_handler_classeshandlersZhandlerr r3r report_eventis  r<cCst||||d}t|S)zVReport a "finish" event. See :py:func:`.report_event` for parameter details. r))r%r<) event_nameevent_descriptionr(r)r:r r rreport_finish_eventsr@cCstt||}t|S)a'Report a "start" event. :param event_name: The name of the event; this should be a topic which events would share (e.g. it will be the same for start and finish events). :param event_description: A human-readable description of the event that has occurred. )rSTART_EVENT_TYPEr<)r>r?r:r r rreport_start_events rBc@seZdZdZdddejdfddZddZddZd d Z e d d Z e j d d Z e ddZ e j ddZ ddZddZdS)ReportEventStackaKContext Manager for using :py:func:`report_event` This enables calling :py:func:`report_start_event` and :py:func:`report_finish_event` through a context manager. :param name: the name of the event :param description: the event's description, passed on to :py:func:`report_start_event` :param message: the description to use for the finish event. defaults to :param:description. :param parent: :type parent: :py:class:ReportEventStack or None The parent of this event. The parent is populated with results of all its children. The name used in reporting is / :param reporting_enabled: Indicates if reporting events should be generated. If not provided, defaults to the parent's value, or True if no parent is provided. :param result_on_exception: The result value to set if an exception is caught. default value is FAIL. :param post_files: Can hold filepaths of files that are to get posted/created regarding a given event. Something like success or failure information in a given log file. For each filepath, if it's a valid regular file it will get: read & encoded as base64 at the close of the event. Default value, if None, is an empty list. NcCs||_||_||_||_||_tj|_|dur2g}||_|durP|rL|j }nd}||_ |rnd |j |f|_ n|j|_ i|_ dS)NT/) parentr rmessageresult_on_exceptionr*rr(r)reporting_enabledjoinfullnamechildren)r r rrFrErHrGr)r r rrs, zReportEventStack.__init__cCsd|j|j|jfS)Nz.ReportEventStack(%s, %s, reporting_enabled=%s))r rrHrr r r__repr__s zReportEventStack.__repr__cCs4tj|_|jrt|j|j|jr0d|jj|j <|S)N)NN) r*rr(rHrBrJrrErKr rr r r __enter__s zReportEventStack.__enter__cCsPtjtjfD]6}|jD]&\}\}}||kr||jfSqq |j|jfSr)r*rrrKr6rFr()r Z cand_result_namevalueZ_msgr r r_childrens_finish_infos z'ReportEventStack._childrens_finish_infocCs|jSr)_resultrr r rr(szReportEventStack.resultcCs|tvrtd|||_dS)Nz'%s' not a valid result)r*r+rQr rOr r rr( s cCs|jdur|jS|jSr)_messagerrr r rrFs zReportEventStack.messagecCs ||_dSr)rSrRr r rrFscCs|r|j|jfS|Sr)rGrFrP)r excr r r _finish_infos zReportEventStack._finish_infocCsD||\}}|jr&||f|jj|j<|jr@t|j|||jddS)Nr=)rUrErKr rHr@rJr))r exc_type exc_value tracebackr(msgr r r__exit__!s zReportEventStack.__exit__)rrrr#r*rrrLrMrPpropertyr(setterrFrUrZr r r rrCs(* '    rCc Cs|sdSg}|D]}tj|s&d}nltd|Lt|d"}t| }Wdn1sj0YWdn1s0Y| ||ddq|S)NzReading rbbase64)pathcontentencoding) osr_isfilerZTimedopenr^Z b64encodereaddecodeappend)r.retfnamer`fpr r rr/+s Nr/)N) r#r^ZloggingZos.pathrbrtypingrrrZcloudinit.reportingrrZcloudinit.reporting.handlersrr'rAr$Z getLoggerrZLOGsetr r*rr%r<rr@rBrCr/r r r rs.    $