509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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&   $
  	