o
    K&b*                     @   sP  d dl Z d dlmZmZ d dlmZ d dlmZ d dlm	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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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G d*d+ d+eZG d,d- d-eZG d.d/ d/eZG d0d1 d1eZ G d2d3 d3eZ!G d4d5 d5eZ"G d6d7 d7e
Z#G d8d9 d9e#Z$G d:d; d;e#Z%G d<d= d=e#Z&G d>d? d?e
Z'G d@dA dAe(Z)G dBdC dCe(Z*G dDdE dEe)Z+G dFdG dGe)Z,dS )H    N)DictOptional)error)messages)PRINT_WRAP_WIDTHc                   @   s0   e Zd ZdZdZd	dedee ddfddZdS )
UserFacingErrorz
    An exception to be raised when an execution-ending error is encountered.

    :param msg:
        Takes a single parameter, which is the user-facing error message that
        should be emitted before exiting non-zero.
       Nmsgmsg_codereturnc                 C   s   || _ || _d S Nr	   r
   )selfr	   r
    r   5/usr/lib/python3/dist-packages/uaclient/exceptions.py__init__   s   
zUserFacingError.__init__r   )__name__
__module____qualname____doc__	exit_codestrr   r   r   r   r   r   r   	   s     r   c                       *   e Zd Zdededdf fddZ  ZS )APTInstallErrornameservice_msgr   Nc                       t  jtjjtjjd d S Nr   )superr   r   ZAPT_INSTALL_FAILEDr	   r   )r   r   r   	__class__r   r   r         
zAPTInstallError.__init__r   r   r   r   r   __classcell__r   r   r   r   r          "r   c                          e Zd Z fddZ  ZS )APTProcessConflictErrorc                    r   r   )r   r   r   ZAPT_PROCESS_CONFLICTr	   r   r   r   r   r   r   "   r!   z APTProcessConflictError.__init__r   r   r   r   r#   r   r   r   r   r&   !       r&   c                       &   e Zd Zdeddf fddZ  ZS )APTInvalidRepoError	error_msgr   Nc                    s   t  j|d d S )N)r	   )r   r   )r   r,   r   r   r   r   *   s   zAPTInvalidRepoError.__init__r"   r   r   r   r   r+   )       r+   c                       s   e Zd Zd fddZ  ZS )APTUpdateProcessConflictErrorr   Nc                    r   r   )r   r   r   ZAPT_UPDATE_PROCESS_CONFLICTr	   r   r'   r   r   r   r   /   r!   z&APTUpdateProcessConflictError.__init__r   Nr(   r   r   r   r   r.   .   s    r.   c                       r*   )APTUpdateInvalidRepoErrorrepo_msgr   Nc                    &   t jj|d}t j|j|jd d S )N)r1   r   )r   ZAPT_UPDATE_INVALID_REPOformatr   r   r	   r   )r   r1   r	   r   r   r   r   7      z"APTUpdateInvalidRepoError.__init__r"   r   r   r   r   r0   6   r-   r0   c                       s,   e Zd Zddee ddf fddZ  ZS )APTInstallProcessConflictErrorN
header_msgr   c                    s2   |r|d7 }t jj|d}t j|j|jd d S )N.
)r6   r   )r   ZAPT_INSTALL_PROCESS_CONFLICTr3   r   r   r	   r   )r   r6   r	   r   r   r   r   =   s   z'APTInstallProcessConflictError.__init__r   )r   r   r   r   r   r   r#   r   r   r   r   r5   <   s    $r5   c                       s2   e Zd Z	ddedee ddf fddZ  ZS )APTInstallInvalidRepoErrorNr1   r6   r   c                    s4   |r|d7 }t jj||d}t j|j|jd d S )Nr7   )r6   r1   r   )r   ZAPT_INSTALL_INVALID_REPOr3   r   r   r	   r   )r   r1   r6   r	   r   r   r   r   I   s   z#APTInstallInvalidRepoError.__init__r   )r   r   r   r   r   r   r#   r   r   r   r   r8   H   s    r8   c                       r   )SnapdNotProperlyInstalledErrorsnap_cmdservicer   Nc                    s(   t jj||d}t j|j|jd d S )N)r:   r;   r   )r   ZSNAPD_NOT_PROPERLY_INSTALLEDr3   r   r   r	   r   )r   r:   r;   r	   r   r   r   r   V   s   z'SnapdNotProperlyInstalledError.__init__r"   r   r   r   r   r9   U   r$   r9   c                       r*   )ErrorInstallingLivepatchr,   r   Nc                    r2   )N)r,   r   )r   ZERROR_INSTALLING_LIVEPATCHr3   r   r   r	   r   )r   r,   r	   r   r   r   r   _   r4   z!ErrorInstallingLivepatch.__init__r"   r   r   r   r   r<   ^   r-   r<   c                       s.   e Zd Zdedededdf fddZ  ZS )InvalidServiceToDisableError	operationr   r   r   Nc                    *   t jj|||d}t j|j|jd d S )N)r>   r   r   r   )r   ZINVALID_SERVICE_OP_FAILUREr3   r   r   r	   r   )r   r>   r   r   r	   r   r   r   r   e      z%InvalidServiceToDisableError.__init__r"   r   r   r   r   r=   d   s    &r=   c                       "   e Zd Zdef fddZ  ZS )ProxyNotWorkingErrorproxyc                    $   t  jtjj|djtjjd d S N)rC   r   )r   r   r   ZNOT_SETTING_PROXY_NOT_WORKINGr3   r	   r   r   rC   r   r   r   r   m      
zProxyNotWorkingError.__init__r"   r   r   r   r   rB   l       rB   c                       rA   )ProxyInvalidUrlrC   c                    rD   rE   )r   r   r   ZNOT_SETTING_PROXY_INVALID_URLr3   r	   r   rF   r   r   r   r   u   rG   zProxyInvalidUrl.__init__r"   r   r   r   r   rI   t   rH   rI   c                   @   s   e Zd ZdZdS )BetaServiceErrorz
    An exception to be raised trying to interact with beta service
    without the right parameters.

    :param msg:
        Takes a single parameter, which is the beta service error message that
        should be emitted before exiting non-zero.
    N)r   r   r   r   r   r   r   r   rJ   |   s    	rJ   c                   @   s   e Zd ZdZdZdS )NonAutoAttachImageErrorz>Raised when machine isn't running an auto-attach enabled imager   N)r   r   r   r   r   r   r   r   r   rK      s    rK   c                       s*   e Zd ZdZdZdef fddZ  ZS )AlreadyAttachedOnPROErrorzERaised when a PRO machine retries attaching with the same instance-idr   instance_idc                    r2   )N)rM   r   )r   ZALREADY_ATTACHED_ON_PROr3   r   r   r	   r   )r   rM   r	   r   r   r   r      r4   z"AlreadyAttachedOnPROError.__init__)r   r   r   r   r   r   r   r#   r   r   r   r   rL      s    rL   c                       s$   e Zd ZdZdZ fddZ  ZS )AlreadyAttachedErrorzDAn exception to be raised when a command needs an unattached system.   c                    s4   t jj|jd ddd}t j|j|jd d S )Nr   r    )Zaccount_namer   )	r   ZALREADY_ATTACHEDr3   Zaccountsgetr   r   r	   r   )r   Zcfgr	   r   r   r   r      s   zAlreadyAttachedError.__init__)r   r   r   r   r   r   r#   r   r   r   r   rN      s    rN   c                       r   )AttachInvalidConfigFileErrorconfig_namer   r   Nc                    s2   t jj||d}t jtj|jtd|j	d d S )N)rS   r   )widthr   )
r   ZATTACH_CONFIG_READ_ERRORr3   r   r   textwrapfillr	   r   r   )r   rS   r   r	   r   r   r   r      s   
z%AttachInvalidConfigFileError.__init__r"   r   r   r   r   rR      r$   rR   c                       r%   )AttachInvalidTokenErrorc                    r   r   )r   r   r   ZATTACH_INVALID_TOKENr	   r   r'   r   r   r   r      r!   z AttachInvalidTokenError.__init__r(   r   r   r   r   rW      r)   rW   c                       s.   e Zd ZdZdededef fddZ  ZS )LockHeldErrora  An exception for when another ua operation is in progress

    :param lock_request: String of the command requesting the lock
    :param lock_holder: String of the command that currently holds the lock
    :param pid: Integer of the process id of the lock_holder
    lock_requestlock_holderpidc                    r?   )N)rY   rZ   r[   r   )r   ZLOCK_HELD_ERRORr3   r   r   r	   r   )r   rY   rZ   r[   r	   r   r   r   r      r@   zLockHeldError.__init__)r   r   r   r   r   intr   r#   r   r   r   r   rX      s    "rX   c                       s    e Zd ZdZ fddZ  ZS )MissingAptURLDirectivez@An exception for when the contract server doesn't include aptURLc                    r2   )N)entitlement_namer   )r   ZMISSING_APT_URL_DIRECTIVEr3   r   r   r	   r   )r   r^   r	   r   r   r   r      s   zMissingAptURLDirective.__init__r   r   r   r   r   r#   r   r   r   r   r]      s    r]   c                       s"   e Zd ZdZd fddZ  ZS )NonRootUserErrorz7An exception to be raised when a user needs to be root.r   Nc                    r   r   )r   r   r   ZNONROOT_USERr	   r   r'   r   r   r   r      s   
zNonRootUserError.__init__r/   r_   r   r   r   r   r`      s    r`   c                       s2   e Zd ZdZejfdejddf fddZ  ZS )UnattachedErrorz>An exception to be raised when a machine needs to be attached.r	   r   Nc                    s   t  j|j|jd d S r   )r   r   r	   r   )r   r	   r   r   r   r      s   zUnattachedError.__init__)	r   r   r   r   r   Z
UNATTACHEDZNamedMessager   r#   r   r   r   r   ra      s    ra   c                       s.   e Zd ZdZdededdf fddZ  ZS )SecurityAPIMetadataErrorzDAn exception raised with Security API metadata returns invalid data.r	   issue_idr   Nc                    s&   t  d| d tjj|d  d S )NzError: 
)Zissue)r   r   r   ZSECURITY_ISSUE_NOT_RESOLVEDr3   )r   r	   rc   r   r   r   r      s   z!SecurityAPIMetadataError.__init__)r   r   r   r   r   r   r#   r   r   r   r   rb      s    "rb   c                   @   s"   e Zd Zdee ddfddZdS )CloudFactoryError
cloud_typer   Nc                 C   s
   || _ d S r   )rf   )r   rf   r   r   r   r      s   
zCloudFactoryError.__init__)r   r   r   r   r   r   r   r   r   r   re      rH   re   c                   @      e Zd ZdS )CloudFactoryNoCloudErrorNr   r   r   r   r   r   r   rh          rh   c                   @   rg   )!CloudFactoryUnsupportedCloudErrorNri   r   r   r   r   rk      rj   rk   c                   @   rg   )CloudFactoryNonViableCloudErrorNri   r   r   r   r   rl      rj   rl   c                   @   rg   )EntitlementNotFoundErrorNri   r   r   r   r   rm     rj   rm   c                
       sL   e Zd Z			ddejdee deeeef  dee f fddZ	  Z
S )	UrlErrorNcausecodeheadersurlc                    sR   t |dd rt|j}nt|}t | || _|| _| jd u r$i | _|| _d S )Nreason)getattrr   rs   r   r   rp   rq   rr   )r   ro   rp   rq   rr   Zcause_errorr   r   r   r     s   

zUrlError.__init__)NNN)r   r   r   r   ZURLErrorr   r\   r   r   r   r#   r   r   r   r   rn     s    rn   c                       s>   e Zd Z			d
dedee dededdf
 fdd	Z  ZS )ProcessExecutionErrorNrP   cmdr   stdoutstderrr   c                    s<   || _ || _|| _|sd}nd}t |j|||d d S )Nz"Invalid command specified '{cmd}'.zEFailed running command '{cmd}' [exit({exit_code})]. Message: {stderr})rv   rx   r   )rw   rx   r   r   r   r3   )r   rv   r   rw   rx   Zmessage_tmplr   r   r   r     s   zProcessExecutionError.__init__)NrP   rP   )r   r   r   r   r   r\   r   r#   r   r   r   r   ru     s    ru   c                       :   e Zd Z fddZdd Zd
ddZ fdd	Z  ZS )ContractAPIErrorc                    sZ   t  ||j|j|j d|v r|d | _n|g| _| jD ]}|d|d|d< qd S )NZ
error_listtitlerp   )r   r   rp   rq   rr   
api_errorsrQ   )r   eerror_response	api_errorr   r   r   r   1  s   
zContractAPIError.__init__c                 C   s<   | j D ]}||dkr dS |dd|r dS qdS )Nrp   TmessagerP   F)r|   rQ   
startswith)r   
error_coder   r   r   r   __contains__:  s   
zContractAPIError.__contains__Nc                 C   s(   | j D ]}|d |kr|d   S q|S )Nrp   detail)r|   )r   r   defaultr   r   r   r   __get__B  s
   
zContractAPIError.__get__c              
      s   t   }g }| jD ].}|ds||d|dd q
|d  D ]}t|tr2|| q%|| q%q
|d | j	 d d
| S )Nextrar   r   rP   : [], )r   __str__r|   rQ   appendvalues
isinstancelistextendrr   join)r   prefixdetailserrr   r   r   r   r   H  s   



zContractAPIError.__str__r   r   r   r   r   r   r   r   r#   r   r   r   r   rz   0  s
    	
rz   c                       ry   )SecurityAPIErrorc                    s*   t  ||j|j|j |dd| _d S )Nr   rP   )r   r   rp   rq   rr   rQ   r   )r   r}   r~   r   r   r   r   X  s   zSecurityAPIError.__init__c                 C   s   t || jv S r   )boolr   )r   r   r   r   r   r   \  s   zSecurityAPIError.__contains__Nc                 C   s   || j v r| j S |S r   )r   )r   Z	error_strr   r   r   r   r   _  s   
zSecurityAPIError.__get__c                    sD   t   }| jg}|r|d | j d d| S |d | j d S )Nr   z] r   r   )r   r   r   rr   r   )r   r   r   r   r   r   r   d  s
   
zSecurityAPIError.__str__r   r   r   r   r   r   r   W  s
    
r   )-rU   typingr   r   Zurllibr   Zuaclientr   Zuaclient.defaultsr   	Exceptionr   r   r&   r+   r.   r0   r5   r8   r9   r<   r=   rB   rI   rJ   rK   rL   rN   rR   rW   rX   r]   r`   ra   rb   re   rh   rk   rl   rm   IOErrorrn   ru   rz   r   r   r   r   r   <module>   sL    	

		'