o
    ÙKÕi‡�  ã                   @   s  d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
 d dlm  mZ d dlmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlm Z  d d	l!m"Z"m#Z# d d
l$m%Z% d dl&m'Z' dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dddddœZ4e 5¡ Z6e 7e 8e9¡¡Z:edddgƒZ;G dd„ dej<ƒZ=G dd „ d e%j>ƒZ?d!e@fd"d#„ZA	$	$dLd%ed&eeBef d'eeBef d(eCd)eCd*eCd+dfd,d-„ZD	.	$	$dMd%ed/eeBef d0eeBef d(eCd)eCd*eCd+e
eeCf fd1d2„ZEd3ejFd+ejGfd4d5„ZHdNd%efd6d7„ZId%ed+ee fd8d9„ZJd%ed:eBd+eeBef fd;d<„ZKd=eeBeBf d>eeBeBf d+eLfd?d@„ZM	dOdAeeBef dBeBdCeBde	eB d+eeLeeBef f f
dDdE„ZN		dPd/eeBef dFe	eB de	eB d+dfdGdH„ZOd%edIeeBef d+ee; fdJdK„ZPdS )Qé    N)Ú
namedtuple)ÚAnyÚDictÚListÚOptionalÚTuple)	Ú
data_typesÚevent_loggerÚ
exceptionsÚhttpÚmessagesÚsecret_managerÚsystemÚutilÚversion)Ú_enabled_services)Ú_is_attached)ÚUAConfig)ÚATTACH_FAIL_DATE_FORMAT)Úattachment_data_fileÚmachine_id_file)Úserviceclient)Úget_user_or_root_log_file_pathz/v1/context/machines/tokenz3/v1/contracts/{contract}/context/machines/{machine}z/v1/resourcesz3/v1/resources/{resource}/context/machines/{machine}z/v1/clouds/{cloud_type}/tokenz3/v1/contracts/{contract}/machine-activity/{machine}z/v1/contractz/v1/magic-attachz?/v1/contracts/{contract}/context/machines/{machine}/guest-tokené   é   é   é   )Úseries_overridesÚseriesÚcloudÚvariantÚEnableByDefaultServiceÚnamer    c                   @   sˆ  e Zd Zejdejdd�ejdejdd�ejdejdd�ejdejdd�ejdejdd�ejdejdd�ejd	ejdd�ejd
ejdd�ejdejdd�ejdejdd�ejdejdd�ejdejdd�ejdejdd�ejdejdd�gZ														ddee dee dee dee dee dee d	ee d
ee dee dee dee dee dee dee fdd„Z	dS )ÚCPUTypeDataÚcpuinfo_cpuF)ÚrequiredÚcpuinfo_cpu_architectureÚcpuinfo_cpu_familyÚcpuinfo_cpu_implementerÚcpuinfo_cpu_partÚcpuinfo_cpu_revisionÚcpuinfo_cpu_variantÚcpuinfo_modelÚcpuinfo_model_nameÚcpuinfo_steppingÚcpuinfo_vendor_idÚ"sys_firmware_devicetree_base_modelÚsysinfo_modelÚsysinfo_typeNc                 C   sX   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _|| _|| _d S ©N©r$   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   )Úselfr$   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   © r6   ú3/usr/lib/python3/dist-packages/uaclient/contract.pyÚ__init__z   s   ÿ
zCPUTypeData.__init__)NNNNNNNNNNNNNN)
Ú__name__Ú
__module__Ú__qualname__r   ÚFieldÚStringDataValueÚfieldsr   Ústrr8   r6   r6   r6   r7   r#   F   sº    ÿýÿýÿÿÿÿÿÿÿýÿÿÒ5ñþýüûúùø	÷
öõôóòñr#   c                       sŽ  e Zd ZdZ	d+dee ddf‡ fdd„Zeje	j
g d¢d�	d+d	d
„ƒZdeeef fdd„Zdedeeef fdd„Zeje	j
g d¢d�dedeeef fdd„ƒZ	d+dededee deeef fdd„Zdd„ Zdedeeef fdd„Zdeeef fdd„Zdefd d!„Z	d+ded"edee deeef fd#d$„Z	d+ded"edee defd%d&„Zded"ededefd'd(„Zd)d*„ Z‡  ZS ),ÚUAContractClientÚcontract_urlNÚcfgÚreturnc                    s   t ƒ j|d� t ¡ | _d S )N©rB   )Úsuperr8   ÚmtfÚget_machine_token_fileÚmachine_token_file)r5   rB   ©Ú	__class__r6   r7   r8       s   zUAContractClient.__init__)r   r   r   )Úretry_sleepsc                 C   sè   |st  | j¡}|  ¡ }| dd |¡i¡ |  ¡ }| ¡ |d< ||dœ}t|ƒ}| j	t
||d�}|jdkr:t ¡ ‚|jdkrCt|ƒ |jdkrRtjt
|j|jd	�‚|j}	tj |	 d
d¡¡ |	 dg ¡D ]}
tj |
 dd¡¡ qe|	S )a}  Requests machine attach to the provided machine_id.

        @param contract_token: Token string providing authentication to
            ContractBearer service endpoint.
        @param machine_id: Optional unique system machine id. When absent,
            contents of /etc/machine-id will be used.

        @return: Dict of the JSON response containing the machine-token.
        ÚAuthorizationú	Bearer {}ÚlastAttachment©Ú	machineIdÚactivityInfo)ÚdataÚheadersé‘  i“  éÈ   ©ÚurlÚcodeÚbodyÚmachineTokenÚ ÚresourceTokensÚtoken)r   Úget_machine_idrB   rS   ÚupdateÚformatÚ_get_activity_infoÚ	isoformatÚ_support_old_machine_infoÚrequest_urlÚAPI_V1_ADD_CONTRACT_MACHINErX   r
   ÚAttachInvalidTokenErrorÚ_raise_attach_forbidden_messageÚContractAPIErrorrY   Ú	json_dictr   ÚsecretsÚ
add_secretÚget)r5   Úcontract_tokenÚattachment_dtÚ
machine_idrS   Úactivity_inforR   Úbackcompat_dataÚresponseÚresponse_jsonr]   r6   r6   r7   Úadd_contract_machine§   s8   
ÿ


ý
ÿz%UAContractClient.add_contract_machinec                 C   sT   |   ¡ }| jt|d |d |d |d dœd�}|jdkr'tjt|j|jd�‚|jS )	z=Requests list of entitlements available to this machine type.Úarchitecturer   ÚkernelÚvirt©ru   r   rv   rw   )Úquery_paramsrU   rV   )ra   rd   ÚAPI_V1_AVAILABLE_RESOURCESrX   r
   rh   rY   ri   )r5   rp   rr   r6   r6   r7   Úavailable_resourcesÒ   s    üþ
	ýz$UAContractClient.available_resourcesrm   c                 C   sN   |   ¡ }| dd |¡i¡ | jt|d�}|jdkr$tjt|j|jd�‚|j	S )NrL   rM   ©rS   rU   rV   )
rS   r_   r`   rd   ÚAPI_V1_GET_CONTRACT_USING_TOKENrX   r
   rh   rY   ri   )r5   rm   rS   rr   r6   r6   r7   Úget_contract_using_tokenæ   s   ÿ
ýz)UAContractClient.get_contract_using_tokenÚ
cloud_typerR   c                C   sz   | j tj|d�|d�}|jdkr.|j dd¡}|r$t |¡ tj	|d�‚tj
t|j|jd�‚|j}tj | dd¡¡ |S )	zÓRequests contract token for auto-attach images for Pro clouds.

        @param instance: AutoAttachCloudInstance for the cloud.

        @return: Dict of the JSON response containing the contract-token.
        )r   )rR   rU   Úmessager[   )Ú	error_msgrV   ÚcontractToken)rd   Ú,API_V1_GET_CONTRACT_TOKEN_FOR_CLOUD_INSTANCEr`   rX   ri   rl   ÚLOGÚdebugr
   ÚInvalidProImagerh   rY   r   rj   rk   )r5   r   rR   rr   Úmsgrs   r6   r6   r7   Ú%get_contract_token_for_cloud_instanceô   s*   
ÿü

ý
ÿz6UAContractClient.get_contract_token_for_cloud_instanceÚmachine_tokenÚresourcero   c           	      C   s²   |st  | j¡}|  ¡ }| dd |¡i¡ tj||d�}| j||d�}|jdkr3t	j
t|j|jd�‚|j d¡rA|jd |jd< |j}| dg ¡D ]}tj | d	d
¡¡ qJ|S )a®  Requests machine access context for a given resource

        @param machine_token: The authentication token needed to talk to
            this contract service endpoint.
        @param resource: Entitlement name.
        @param machine_id: Optional unique system machine id. When absent,
            contents of /etc/machine-id will be used.

        @return: Dict of the JSON response containing entitlement accessInfo.
        rL   rM   )rŠ   Úmachiner|   rU   rV   Úexpiresr\   r]   r[   )r   r^   rB   rS   r_   r`   Ú"API_V1_GET_RESOURCE_MACHINE_ACCESSrd   rX   r
   rh   rY   rl   ri   r   rj   rk   )	r5   r‰   rŠ   ro   rS   rW   rr   rs   r]   r6   r6   r7   Úget_resource_machine_access  s(   ÿ
ýz,UAContractClient.get_resource_machine_accessc                 C   s®   | j j}| j j d¡}t | j¡}|  ¡ }tj	||d�}|  
¡ }| dd 	|¡i¡ | j|||d�}|jdkrAtj||j|jd�‚|jrU| j j}|j|d< | j  |¡ d	S d	S )
z§Report current activity token and enabled services.

        This will report to the contracts backend all the current
        enabled services in the system.
        rZ   ©Úcontractr‹   rL   rM   )rS   rR   rU   rV   rQ   N)rH   Úcontract_idr‰   rl   r   r^   rB   ra   ÚAPI_V1_UPDATE_ACTIVITY_TOKENr`   rS   r_   rd   rX   r
   rh   rY   ri   Úwrite)r5   r‘   r‰   ro   Úrequest_datarW   rS   rr   r6   r6   r7   Úupdate_activity_token;  s*   ÿÿ

ÿ
÷z&UAContractClient.update_activity_tokenÚmagic_tokenc                 C   sœ   |   ¡ }| dd |¡i¡ | jt|d�}|jdkrt ¡ ‚|jdkr't ¡ ‚|jdkr6tj	t|j|j
d�‚|j}g d¢}|D ]}tj | |d	¡¡ q?|S )
z¸Request magic attach token info.

        When the magic token is registered, it will contain new fields
        that will allow us to know that the attach process can proceed
        rL   rM   r|   rT   é÷  rU   rV   ©r]   ÚuserCoder‚   r[   )rS   r_   r`   rd   Ú"API_V1_GET_MAGIC_ATTACH_TOKEN_INFOrX   r
   ÚMagicAttachTokenErrorÚMagicAttachUnavailablerh   rY   ri   r   rj   rk   rl   )r5   r–   rS   rr   rs   Úsecret_fieldsÚfieldr6   r6   r7   Úget_magic_attach_token_infoc  s(   ÿ


ýz,UAContractClient.get_magic_attach_token_infoc                 C   sx   |   ¡ }| jt|dd�}|jdkrt ¡ ‚|jdkr$tjt|j|jd�‚|j}g d¢}|D ]}t	j
 | |d¡¡ q-|S )z)Create a magic attach token for the user.ÚPOST©rS   Úmethodr—   rU   rV   r˜   r[   )rS   rd   ÚAPI_V1_NEW_MAGIC_ATTACHrX   r
   rœ   rh   rY   ri   r   rj   rk   rl   )r5   rS   rr   rs   r�   rž   r6   r6   r7   Únew_magic_attach_token  s&   ý

ýz'UAContractClient.new_magic_attach_tokenc                 C   s„   |   ¡ }| dd |¡i¡ | jt|dd�}|jdkrt ¡ ‚|jdkr(t ¡ ‚|jdkr1t 	¡ ‚|jdkr@tj
t|j|jd	�‚d
S )z)Revoke a magic attach token for the user.rL   rM   ÚDELETEr¡   é�  rT   r—   rU   rV   N)rS   r_   r`   rd   ÚAPI_V1_REVOKE_MAGIC_ATTACHrX   r
   Ú MagicAttachTokenAlreadyActivatedr›   rœ   rh   rY   )r5   r–   rS   rr   r6   r6   r7   Úrevoke_magic_attach_token–  s(   ý



ýÿz*UAContractClient.revoke_magic_attach_tokenr‘   c              	   C   s®   |st  | j¡}|  ¡ }| dd |¡i¡ tj||d�}|  ¡ }| j|d||d |d |d |d d	œd
�}|j	dkrFt
j||j	|jd�‚|j d¡rT|jd |jd< |jS )a|  Get the updated machine token from the contract server.

        @param machine_token: The machine token needed to talk to
            this contract service endpoint.
        @param contract_id: Unique contract id provided by contract service
        @param machine_id: Optional unique system machine id. When absent,
            contents of /etc/machine-id will be used.
        rL   rM   r�   ÚGETru   r   rv   rw   rx   )r¢   rS   ry   rU   rV   rŒ   )r   r^   rB   rS   r_   r`   ÚAPI_V1_GET_CONTRACT_MACHINEra   rd   rX   r
   rh   rY   rl   ri   )r5   r‰   r‘   ro   rS   rW   rp   rr   r6   r6   r7   Úget_contract_machine­  s4   þüü

ÿz%UAContractClient.get_contract_machinec           	      C   s¢   |st  | j¡}|  ¡ }| dd |¡i¡ ||  ¡ dœ}t|ƒ}tj||d�}| j	||d|d�}|j
dkr@tj||j
|jd�‚|j d	¡rN|jd	 |jd	< |jS )
aÈ  Request machine token refresh from contract server.

        @param machine_token: The machine token needed to talk to
            this contract service endpoint.
        @param contract_id: Unique contract id provided by contract service.
        @param machine_id: Optional unique system machine id. When absent,
            contents of /etc/machine-id will be used.

        @return: Dict of the JSON response containing refreshed machine-token
        rL   rM   rO   r�   r    )rS   r¢   rR   rU   rV   rŒ   )r   r^   rB   rS   r_   r`   ra   rc   ÚAPI_V1_UPDATE_CONTRACT_MACHINErd   rX   r
   rh   rY   rl   ri   )	r5   r‰   r‘   ro   rS   rR   rq   rW   rr   r6   r6   r7   Úupdate_contract_machineØ  s*   þÿÿ

ÿz(UAContractClient.update_contract_machinec                 C   st   |   ¡ }| dd |¡i¡ tj||d�}| j||dd�}|jdkr(tjdd�‚|jd	kr7tj||j|j	d
�‚|j
S )a±  Request guest token associated with this machine's contract
        @param machine_token: The machine token needed to talk to
            this contract service endpoint.
        @param contract_id: Unique contract id provided by contract service
        @param machine_id: Unique machine id that was registered with the pro
            backend on attach.
        @return: Dict of the JSON response containing the guest token
        rL   rM   r�   rª   r¡   r¦   Úget_guest_token)Úfeature_namerU   rV   )rS   r_   r`   ÚAPI_V1_GET_GUEST_TOKENrd   rX   r
   Ú FeatureNotSupportedOldTokenErrorrh   rY   ri   )r5   r‰   r‘   ro   rS   rW   rr   r6   r6   r7   r¯      s$   þ
ÿ
ýz UAContractClient.get_guest_tokenc                 C   sü   t  ¡ }t  ¡ jt  ¡ jt  ¡ jt  ¡ t  ¡ t  	¡ t
 ¡ t|j|j|j|j|j|j|j|j|j|j|j|j|j|jd�jdd�dœ}t| jƒjrvt| jƒj }t! "¡ }| j#j$p[t  %| j¡| j#j&dd„ |D ƒdd„ |D ƒ|rq|j' (¡ nd	d
œ}ni }i |¥|¥S )z9Return a dict of activity info data for contract requestsr4   F)Ú	keep_none)Údistributionrv   r   ru   Údesktoprw   ÚclientVersionÚcpu_typec                 S   s   g | ]}|j ‘qS r6   )r"   ©Ú.0Úservicer6   r6   r7   Ú
<listcomp>H  s    z7UAContractClient._get_activity_info.<locals>.<listcomp>c                 S   s   i | ]
}|j r|j|j“qS r6   )Úvariant_enabledr"   Úvariant_namer¸   r6   r6   r7   Ú
<dictcomp>I  s    ýÿz7UAContractClient._get_activity_info.<locals>.<dictcomp>N)Ú
activityIDÚactivityTokenÚ	resourcesÚresourceVariantsrN   ))r   Úget_cpu_infoÚget_release_infor´   Úget_kernel_infoÚuname_releaser   Úget_dpkg_archÚ
is_desktopÚget_virt_typer   Úget_versionr#   r$   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   Úto_dictr   rB   Úis_attachedr   Úenabled_servicesr   ÚreadrH   Úactivity_idr^   Úactivity_tokenÚattached_atrb   )r5   ÚcpuinfoÚmachine_inforÍ   Úattachment_datarp   r6   r6   r7   ra   #  s^   òñø
þÿóÿþz#UAContractClient._get_activity_infor3   )r9   r:   r;   Úcfg_url_base_attrr   r   r8   r   ÚretryÚsocketÚtimeoutrt   r   r?   r   r{   r~   rˆ   rŽ   r•   rŸ   r¤   r©   r¬   r®   r¯   ra   Ú__classcell__r6   r6   rI   r7   r@   �   s~    þþýÿ*ÿ
ÿ$üþýü

û&(üþýü

û/üþýü
û(þýü
û#r@   Úrequest_bodyc              	   C   sJ   |   di ¡}|   d¡||  d¡|  d¡|  d¡|  d¡dt ¡ jdœd	œS )
a?  
    Transforms a request_body that has the new activity_info into a body that
    includes both old and new forms of machineInfo/activityInfo

    This is necessary because there may be old ua-airgapped contract
    servers deployed that we need to support.
    This function is used for attach and refresh calls.
    rQ   rP   ru   r´   rv   r   ÚLinux)r´   rv   r   ÚtypeÚrelease)rP   rQ   ru   Úos)rl   r   rÄ   rÝ   )rÚ   rp   r6   r6   r7   rc   ]  s   	ùürc   TrB   Úpast_entitlementsÚnew_entitlementsÚallow_enabler   ÚverboserC   c                 C   sl  ddl m} d}g }g }	|| ƒD ]}}
z||
 }W n	 ty!   Y qw g }	zt| | |
i ¡||||d�\}}W nM tjy\ } zt |¡ d}|	 	|
¡ t 
d|
|¡ W Y d}~qd}~w tyƒ } zt |¡ | 	|¡ |	 	|
¡ t d|
|¡ W Y d}~qd}~ww |r�|r�t |
¡ qt |	¡ t|ƒdkr§tjd	d
„ t|	|ƒD ƒd�‚|r´tjdd
„ |	D ƒd�‚dS )aã  Iterate over all entitlements in new_entitlement and apply any delta
    found according to past_entitlements.

    :param cfg: UAConfig instance
    :param past_entitlements: dict containing the last valid information
        regarding service entitlements.
    :param new_entitlements: dict containing the current information regarding
        service entitlements.
    :param allow_enable: Boolean set True if allowed to perform the enable
        operation. When False, a message will be logged to inform the user
        about the recommended enabled service.
    :param series_overrides: Boolean set True if series overrides should be
        applied to the new_access dict.
    :param verbose: If True, display output to stdout
    r   )Úentitlements_enable_orderF)rB   Úorig_accessÚ
new_accessrá   r   râ   Tz+Failed to process contract delta for %s: %rNz5Unexpected error processing contract delta for %s: %rc                 S   s*   g | ]\}}|t jjt|ƒtƒ d �f‘qS ))r�   Úlog_path)r   ÚUNEXPECTED_ERRORr`   r?   r   )r¹   r"   Ú	exceptionr6   r6   r7   r»   Á  s    úþþÿz.process_entitlements_delta.<locals>.<listcomp>)Úfailed_servicesc                 S   s   g | ]}|t jf‘qS r6   )r   Ú!E_ATTACH_FAILURE_DEFAULT_SERVICES)r¹   r"   r6   r6   r7   r»   Î  s    ÿÿ)Úuaclient.entitlementsrã   ÚKeyErrorÚprocess_entitlement_deltarl   r
   ÚUbuntuProErrorr„   rè   ÚappendÚerrorÚ	ExceptionÚeventÚservice_processedÚservices_failedÚlenÚAttachFailureUnknownErrorÚzipÚAttachFailureDefaultServices)rB   rß   rà   rá   r   râ   rã   Údelta_errorÚunexpected_errorsré   r"   Únew_entitlementÚdeltasÚservice_enabledÚer6   r6   r7   Úprocess_entitlements_deltax  st   ÿ
ú

ý€


ý€ü
€
øÿþÿÿrÿ   Frä   rå   c              
   C   sÚ   ddl m} |rt|ƒ t ||¡}d}|ri| di ¡ d¡}	|	s*| di ¡ d¡}	|	s3tj||d�‚| di ¡ di ¡ d	d
¡}
z	|| |	|
d�}W n tjy_ } zt	 
d|	¡ |‚d}~ww |j||||d�}||fS )ab  Process a entitlement access dictionary deltas if they exist.

    :param cfg: UAConfig instance
    :param orig_access: Dict with original entitlement access details before
        contract refresh deltas
    :param new_access: Dict with updated entitlement access details after
        contract refresh
    :param allow_enable: Boolean set True if allowed to perform the enable
        operation. When False, a message will be logged to inform the user
        about the recommended enabled service.
    :param series_overrides: Boolean set True if series overrides should be
        applied to the new_access dict.
    :param verbose: If True, display output to stdout

    :raise UbuntuProError: on failure to process deltas.
    :return: A tuple containing a dict of processed deltas and a
             boolean indicating if the service was fully processed
    r   ©Úentitlement_factoryFÚentitlementrÜ   )ÚorigÚnewÚentitlementsÚobligationsÚuse_selectorr[   ©rB   r"   r    z3Skipping entitlement deltas for "%s". No such classN©rá   râ   )rë   r  Úapply_contract_overridesr   Úget_dict_deltasrl   r
   Ú InvalidContractDeltasServiceTypeÚEntitlementNotFoundErrorr„   r…   Úprocess_contract_deltas)rB   rä   rå   rá   r   râ   r  rü   Úretr"   r    r  Úexcr6   r6   r7   rí   Õ  sD   ÿ
ý
ýÿ€üÿrí   rr   c                 C   sœ   | j  d¡}|rJ|d }|d }|dkr(|d  t¡}tj|||d  d¡d�‚|dkr@|d  t¡}tj|||d  d¡d	�‚|d
krJtj|d�‚t ¡ ‚)NÚinfoÚ
contractIdÚreasonzno-longer-effectiveÚtimez%m-%d-%Y)r‘   ÚdateÚcontract_expiry_dateznot-effective-yet)r‘   r  Úcontract_effective_dateznever-effective)r‘   )	ri   rl   Ústrftimer   r
   ÚAttachForbiddenExpiredÚAttachForbiddenNotYetÚAttachForbiddenNeverÚAttachExpiredToken)rr   r  r‘   r  r  r6   r6   r7   rg     s*   üürg   c           
      C   sš   t  | ¡}| ¡ }|j}|d }|d d d }t| d�}|j||d�}| |¡ tj 	¡  | 
di ¡ 
dt | ¡¡}	t |	¡ t| || ¡ d|d	� d
S )a  Request contract refresh from ua-contracts service.

    :param verbose: If True, display output to stdout

    :raise UbuntuProError: on failure to update contract or error processing
        contract deltas
    :raise ConnectivityError: On failure during a connection
    rZ   ÚmachineTokenInfoÚcontractInfoÚidrD   )r‰   r‘   rP   Fr	  N)rF   rG   r  r‰   r@   r®   r“   r   r^   Úcache_clearrl   r   rÿ   )
rB   râ   rH   Úorig_entitlementsÚ
orig_tokenr‰   r‘   Úcontract_clientÚrespro   r6   r6   r7   Úrefresh3  s,   
	
ÿ


ÿ

ûr%  c                 C   s   t | ƒ}| ¡ }| dg ¡S )zDQuery available resources from the contract server for this machine.rÁ   )r@   r{   rl   )rB   ÚclientrÁ   r6   r6   r7   Úget_available_resourcesW  s   r'  r]   c                 C   s   t | ƒ}| |¡S )z/Query contract information for a specific token)r@   r~   )rB   r]   r&  r6   r6   r7   Úget_contract_information^  s   
r(  Úoverride_selectorÚselector_valuesc                 C   s<   d}|   ¡ D ]\}}||f|  ¡ vr dS |t| 7 }q|S )Nr   )ÚitemsÚOVERRIDE_SELECTOR_WEIGHTS)r)  r*  Úoverride_weightÚselectorÚvaluer6   r6   r7   Ú_get_override_weightd  s   r0  r  Úseries_namer   c           
      C   sz   i }||dœ}|r||d< |   di ¡  |i ¡}|r||td < t |  dg ¡¡}|D ]}t|  d¡|ƒ}	|	r:|||	< q*|S )N)r   r   r    r   r   Ú	overridesr.  )Úpopr,  ÚcopyÚdeepcopyrl   r0  )
r  r1  r   r    r2  r*  r   Úgeneral_overridesÚoverrideÚweightr6   r6   r7   Ú_select_overridesp  s"   

ÿ
ÿ€r9  r   c                 C   sÆ   ddl m} tt| tƒd| v gƒstd | ¡ƒ‚|du r!t ¡ j	n|}|ƒ \}}|  
di ¡}t||||ƒ}t| ¡ ƒD ]%\}	}
|
 ¡ D ]\}}| d  
|¡}t|tƒrY| |¡ qC|| d |< qCq;dS )a—  Apply series-specific overrides to an entitlement dict.

    This function mutates orig_access dict by applying any series-overrides to
    the top-level keys under 'entitlement'. The series-overrides are sparse
    and intended to supplement existing top-level dict values. So, sub-keys
    under the top-level directives, obligations and affordance sub-key values
    will be preserved if unspecified in series-overrides.

    To more clearly indicate that orig_access in memory has already had
    the overrides applied, the 'series' key is also removed from the
    orig_access dict.

    :param orig_access: Dict with original entitlement access details
    r   )Úget_cloud_typer  z?Expected entitlement access dict. Missing "entitlement" key: {}N)Úuaclient.clouds.identityr:  ÚallÚ
isinstanceÚdictÚRuntimeErrorr`   r   rÄ   r   rl   r9  Úsortedr+  r_   )rä   r   r    r:  r1  r   Ú_Úorig_entitlementr2  Ú_weightÚoverrides_to_applyÚkeyr/  Úcurrentr6   r6   r7   r
  �  s*   þÿ
ÿ
øÿr
  r  c              	   C   s®   ddl m} g }| ¡ D ]H\}}| di ¡ dd¡}z	|| ||d�}W n
 tjy-   Y qw | di ¡ di ¡}| d¡}	| ||	¡rT| ¡ \}
}|
rT| t	||d	�¡ q|S )
Nr   r   r  r  r[   r  r  ÚresourceToken)r"   r    )
rë   r  r+  rl   r
   r  Ú_should_enable_by_defaultÚ
can_enablerï   r!   )rB   r  r  Úenable_by_default_servicesÚent_nameÚ	ent_valuer    Úentr  rG  rI  rA  r6   r6   r7   Úget_enabled_by_default_services¾  s,   ÿ
þÿ€rN  )TT)FTT)Tr3   )NN)Qr4  Úloggingr×   Úcollectionsr   Útypingr   r   r   r   r   Úuaclient.files.machine_tokenÚfilesr‰   rF   Úuaclientr   r	   r
   r   r   r   r   r   r   Ú-uaclient.api.u.pro.status.enabled_services.v1r   Ú(uaclient.api.u.pro.status.is_attached.v1r   Úuaclient.configr   Úuaclient.defaultsr   Úuaclient.files.state_filesr   r   Úuaclient.httpr   Úuaclient.logr   re   r«   r­   rz   r�   rƒ   r’   r}   rš   r£   r§   r±   r,  Úget_event_loggerrò   Ú	getLoggerÚreplace_top_level_logger_namer9   r„   r!   Ú
DataObjectr#   ÚUAServiceClientr@   r>  rc   r?   Úboolrÿ   rí   ÚHTTPResponseÚNamedMessagerg   r%  r'  r(  Úintr0  r9  r
  rN  r6   r6   r6   r7   Ú<module>   sþ    ,ÿÿÿÿÿüÿW   C úÿ
þ
ýüûú
ùaúÿ
þ
ýüûú

ùAÿ
þ$
ÿ
ÿ
þü
ÿþýü
ûý
ÿþý
ü1ÿ
ÿþ