U
    Ld                     @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlZd dlmZ d dlmZ d dlmZ eeZde
e eeed
ddZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )    N)datetime)StringIO)AnyDictListOptional)version)identity)UrlError|')data	delimiter	quotecharreturnc              
   C   sD   t  4}tj|||tjd|  |  W  5 Q R  S Q R X dS )zEncode report data with csv.)r   r   ZquotingN)r   csvwriterZQUOTE_MINIMALZwriterowgetvaluerstrip)r   r   r   io r   @/usr/lib/python3/dist-packages/cloudinit/sources/azure/errors.pyencode_report   s    r   c                   @   sZ   e Zd Zddeeeeef  ddddZedddZe	dd	d
Z
edddZdS )ReportableErrorN)supporting_data)reasonr   r   c             
   C   sz   dt   | _d| _|| _|r(|| _ni | _t | _zt	
 | _W n. tk
rt } zd|| _W 5 d }~X Y nX d S )NzCloud-Init/z%https://aka.ms/linuxprovisioningerrorzfailed to read vm id: )r   Zversion_stringagentdocumentation_urlr   r   r   Zutcnow	timestampr	   Zquery_vm_idvm_id	Exception)selfr   r   Zid_errorr   r   r   __init__'   s    
zReportableError.__init__)r   c                 C   sd   dd| j  d| j g}|dd | j D 7 }|d| j d| j  d| j g7 }t|S )	Nzresult=errorzreason=zagent=c                 S   s   g | ]\}}| d | qS )=r   ).0kvr   r   r   
<listcomp>E   s     z5ReportableError.as_encoded_report.<locals>.<listcomp>zvm_id=z
timestamp=zdocumentation_url=)	r   r   r   itemsr   r   Z	isoformatr   r   )r!   r   r   r   r   as_encoded_report=   s    



z!ReportableError.as_encoded_reportc                 C   s.   t |to,| j|jko,| j|jko,| j|jkS )N)
isinstancer   r   r   r   )r!   otherr   r   r   __eq__N   s    



zReportableError.__eq__c                 C   s&   | j j d| j d| j d| j dS )Nz(reason=z, timestamp=z, supporting_data=))	__class____name__r   r   r   )r!   r   r   r   __repr__V   s    $zReportableError.__repr__)r/   
__module____qualname__strr   r   r   r"   r)   boolr,   r0   r   r   r   r   r   &   s   r   c                       s$   e Zd Zedd fddZ  ZS )$ReportableErrorDhcpInterfaceNotFoundN)durationr   c                    s   t  d || jd< d S )Nzfailure to find DHCP interfacer6   superr"   r   )r!   r6   r.   r   r   r"   `   s    z-ReportableErrorDhcpInterfaceNotFound.__init__)r/   r1   r2   floatr"   __classcell__r   r   r9   r   r5   _   s   r5   c                       s*   e Zd Zeee dd fddZ  ZS )ReportableErrorDhcpLeaseN)r6   	interfacer   c                    s$   t  d || jd< || jd< d S )Nzfailure to obtain DHCP leaser6   r=   r7   )r!   r6   r=   r9   r   r   r"   g   s    
z!ReportableErrorDhcpLease.__init__)r/   r1   r2   r:   r   r3   r"   r;   r   r   r9   r   r<   f   s   r<   c                       s&   e Zd Zeedd fddZ  ZS )ReportableErrorImdsUrlErrorN)	exceptionr6   r   c                   s   t |jtjrd}n8t |jtjr(d}n$t |jtjr<d}n|jrHd}nd}t | |jrj|j| j	d< || j	d< t
|| j	d< |j| j	d	< d S )
Nz connection timeout querying IMDSzconnection error querying IMDSzread timeout querying IMDSzhttp error querying IMDSzunexpected error querying IMDSZ	http_coder6   r?   url)r*   causerequestsZConnectTimeoutConnectionErrorZReadTimeoutcoder8   r"   r   reprr@   )r!   r?   r6   r   r9   r   r   r"   o   s    
z$ReportableErrorImdsUrlError.__init__)r/   r1   r2   r
   r:   r"   r;   r   r   r9   r   r>   n   s   r>   c                       s$   e Zd Zedd fddZ  ZS )+ReportableErrorImdsMetadataParsingExceptionNr?   r   c                   s   t  d t|| jd< d S )Nzerror parsing IMDS metadatar?   )r8   r"   rE   r   )r!   r?   r9   r   r   r"      s    z4ReportableErrorImdsMetadataParsingException.__init__)r/   r1   r2   
ValueErrorr"   r;   r   r   r9   r   rF      s   rF   c                       s$   e Zd Zedd fddZ  ZS )!ReportableErrorUnhandledExceptionNrG   c                    sX   t  d dtt|||j}t|	d
d}t|| jd< || jd< d S )Nzunhandled exception zutf-8r?   Ztraceback_base64)r8   r"   join	tracebackformat_exceptiontype__traceback__base64Z	b64encodeencodedecoderE   r   )r!   r?   ZtraceZtrace_base64r9   r   r   r"      s      z*ReportableErrorUnhandledException.__init__)r/   r1   r2   r    r"   r;   r   r   r9   r   rI      s   rI   )r   r   )rP   r   ZloggingrL   r   r   r   typingr   r   r   r   rB   Z	cloudinitr   Zcloudinit.sources.azurer	   Zcloudinit.url_helperr
   Z	getLoggerr/   ZLOGr3   r   r    r   r5   r<   r>   rF   rI   r   r   r   r   <module>   s2   
     9