
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\me#                 @   s   d Z ddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZ dZdZdZG d	d
 d
eZedZG dd dZG dd deZdddZejdfddZdd ZG dd dZdd ZdS )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)available_handlersinstantiated_handler_registry)ReportingHandlerZfinishstartZ	cloudinitc               @   s   e Zd Zdd ZdS )_namesetc             C   s   || kr|S t d| d S )Nz%s not a valid value)AttributeError)selfname r   /usr/lib/python3.6/events.py__getattr__   s    z_nameset.__getattr__N)__name__
__module____qualname__r   r   r   r   r   r      s   r   SUCCESSWARNFAILc               @   s.   e Zd ZdZedfddZdd Zdd ZdS )	ReportingEventz"Encapsulation of event formatting.Nc             C   s2   || _ || _|| _|| _|d kr(tj }|| _d S )N)
event_typer
   descriptionorigintime	timestamp)r	   r   r
   r   r   r   r   r   r   __init__)   s    zReportingEvent.__init__c             C   s   dj | j| j| jS )z"The event represented as a string.z{0}: {1}: {2})formatr   r
   r   )r	   r   r   r   	as_string9   s    zReportingEvent.as_stringc             C   s   | j | j| j| j| jdS )z&The event represented as a dictionary.)r
   r   r   r   r   )r
   r   r   r   r   )r	   r   r   r   as_dict?   s
    zReportingEvent.as_dict)r   r   r   __doc__DEFAULT_EVENT_ORIGINr   r   r   r   r   r   r   r   &   s
   
r   c                   s8   e Zd Zejdf fdd	Zdd Z fddZ  ZS )FinishReportingEventNc                sD   t t| jt|| || _|d kr&g }|| _|tkr@td| d S )NzInvalid result: %s)superr    r   FINISH_EVENT_TYPEresult
post_filesstatus
ValueError)r	   r
   r   r#   r$   )	__class__r   r   r   K   s    

zFinishReportingEvent.__init__c             C   s   dj | j| j| j| jS )Nz{0}: {1}: {2}: {3})r   r   r
   r#   r   )r	   r   r   r   r   X   s    zFinishReportingEvent.as_stringc                s0   t t| j }| j|d< | jr,t| j|d< |S )z'The event represented as json friendly.r#   files)r!   r    r   r#   r$   _collect_file_info)r	   data)r'   r   r   r   ]   s
    
zFinishReportingEvent.as_dict)	r   r   r   r%   r   r   r   r   __classcell__r   r   )r'   r   r    J   s   r    c                sX    si   fddt jj D }ttjj }x$|D ]}t||krFq4|j|  q4W dS )a  Report 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.
    c                s   h | ]\}}| kr|qS r   r   ).0Z	hndl_typeZhndl_cls)excluded_handler_typesr   r   	<setcomp>v   s   zreport_event.<locals>.<setcomp>N)r   Zregistered_itemsitemslistr   valuestypeZpublish_event)eventr-   Zexcluded_handler_classesZhandlersZhandlerr   )r-   r   report_eventf   s    

r4   c             C   s   t | |||d}t|S )zVReport a "finish" event.

    See :py:func:`.report_event` for parameter details.
    )r$   )r    r4   )
event_nameevent_descriptionr#   r$   r3   r   r   r   report_finish_event   s    r7   c             C   s   t t| |}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.
    )r   START_EVENT_TYPEr4   )r5   r6   r3   r   r   r   report_start_event   s    
r9   c               @   s   e Zd ZdZdddejdfddZdd Zdd Zd	d
 Z	e
dd Zejdd Ze
dd Zejdd Zdd Zdd ZdS )ReportEventStackaK  Context 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 <parent.name>/<name>

    :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.
    Nc             C   s   || _ || _|| _|| _|| _tj| _|d kr2g }|| _|d krP|rL|j	}nd}|| _	|rndj
|j|f| _n| j| _i | _d S )NT/)parentr
   r   messageresult_on_exceptionr%   r   r#   r$   reporting_enabledjoinfullnamechildren)r	   r
   r   r=   r<   r?   r>   r$   r   r   r   r      s(    
zReportEventStack.__init__c             C   s   d| j | j| jf S )Nz.ReportEventStack(%s, %s, reporting_enabled=%s))r
   r   r?   )r	   r   r   r   __repr__   s    zReportEventStack.__repr__c             C   s4   t j| _| jrt| j| j | jr0d| jj| j	< | S )N)NN)
r%   r   r#   r?   r9   rA   r   r<   rB   r
   )r	   r   r   r   	__enter__   s    zReportEventStack.__enter__c             C   sP   xBt jt jfD ]2}x,| jj D ]\}\}}||kr|| jfS qW qW | j| jfS )N)r%   r   r   rB   r/   r=   r#   )r	   Zcand_result_namevalueZ_msgr   r   r   _childrens_finish_info   s
    z'ReportEventStack._childrens_finish_infoc             C   s   | j S )N)_result)r	   r   r   r   r#     s    zReportEventStack.resultc             C   s   |t krtd| || _d S )Nz'%s' not a valid result)r%   r&   rH   )r	   rF   r   r   r   r#     s    c             C   s   | j d k	r| j S | jS )N)_messager   )r	   r   r   r   r=     s    
zReportEventStack.messagec             C   s
   || _ d S )N)rI   )r	   rF   r   r   r   r=     s    c             C   s   |r| j | jfS | j S )N)r>   r=   rG   )r	   excr   r   r   _finish_info  s    zReportEventStack._finish_infoc             C   sD   | j |\}}| jr&||f| jj| j< | jr@t| j||| jd d S )N)r$   )rK   r<   rB   r
   r?   r7   rA   r$   )r	   exc_type	exc_value	tracebackr#   msgr   r   r   __exit__  s    zReportEventStack.__exit__)r   r   r   r   r%   r   r   rC   rD   rG   propertyr#   setterr=   rK   rP   r   r   r   r   r:      s   %r:   c             C   sj   | sd S g }xX| D ]P}t jj|s(d }n(t|d}tj|j j }W d Q R X |j||dd qW |S )Nrbbase64)pathcontentencoding)	osrU   isfileopenrT   Z	b64encodereaddecodeappend)r(   retZfnamerV   fpr   r   r   r)   (  s    
r)   )r   r   r   )N)r   rT   Zos.pathrX   r   Ztypingr   Zcloudinit.reportingr   r   Zcloudinit.reporting.handlersr   r"   r8   r   setr   r%   r   r    r4   r   r7   r9   r:   r)   r   r   r   r   <module>
   s&   $
  	