o
    (f/#                     @   sj  d dl Z d dlZd dlmZ d dl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 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 dl m!Z! d dl"m#Z# d dl$m%Z%m&Z& d dl'm(Z( eeeeeej)ej*ej+eee!e%e&gZ,				d>dede-de-de.de.deee-  fddZ/d?dede.dee- fdd Z0ded!ee- dee- fd"d#Z1e j2G d$d% d%e j3Z4dedee- fd&d'Z5dedee- fd(d)Z6ded*ee d+e4d,ee-e.f d-ee- f
d.d/Z7ded+e4dee- fd0d1Z8d2ee- defd3d4Z9dede
j:fd5d6Z;d7d8 Z<dede.fd9d:Z=d@ded;e-fd<d=Z>dS )A    N)defaultdict)DictListOptionalType)
exceptions)UAConfig)fips)AnboxEntitlement)UAEntitlement)CommonCriteriaEntitlement)CISEntitlement)ApplicabilityStatus)ESMAppsEntitlementESMInfraEntitlement)LandscapeEntitlement)LivepatchEntitlement)RealtimeKernelEntitlement)RepoEntitlement)ROSEntitlementROSUpdatesEntitlement)EntitlementNotFoundError Fcfgnamevariantpurgeaccess_only
extra_argsc                 C   sj   t D ]-}|| ||||d}||jv r/|s|  S ||jv r*|j| | |||d  S t|dqt|d)a  Returns a UAEntitlement object based on the provided name.

    The return type is Optional[Type[UAEntitlement]].
    It cannot be explicit because of the Python version on Xenial (3.5.2).
    :param cfg: UAConfig instance
    :param name: The name of the entitlement to return
    :param  variant: The variant name to be used
    :param purge: If purge operation is enabled
    :param access_only: If entitlement should be set with access only
    :param extra_args: Extra parameters to create the entitlement

    :raise EntitlementNotFoundError: If not_found_okay is False and no
        entitlement with the given name is found, then raises this error.
    )r   r   called_namer   r   )r   r   r   r   )entitlement_name)ENTITLEMENT_CLASSESvalid_namesvariantsr   )r   r   r   r   r   r   entitlementent r&   @/usr/lib/python3/dist-packages/uaclient/entitlements/__init__.pyentitlement_factory'   s*   




r(   	all_namesreturnc                    sF   t }|rg }|D ]}|| dj qt|S t fdd|D S )zReturn a list of valid services.

    :param cfg: UAConfig instance
    :param all_names: if we should return all the names for a service instead
        of just the presentation_name
    r   c                    s   g | ]}| d j qS )r+   )presentation_name).0entitlement_clsr+   r&   r'   
<listcomp>e   s    
z"valid_services.<locals>.<listcomp>)r!   extendr"   sorted)r   r)   entitlementsnamesr.   r&   r+   r'   valid_servicesU   s   
r4   entsc                    s(   t | fdd t| fdddS )zR
    A function to sort entitlments for enabling that preserves invalid names
    c                    s(   z  | W S  ty   t  Y S w N)index
ValueErrorlenr%   )valid_ents_orderedr&   r'    sort_order_with_nonexistent_lastt   s
   zIorder_entitlements_for_enabling.<locals>.sort_order_with_nonexistent_lastc                    s    | S r6   r&   r:   )r<   r&   r'   <lambda>z   s    z1order_entitlements_for_enabling.<locals>.<lambda>)key)entitlements_enable_orderr1   )r   r5   r&   )r<   r;   r'   order_entitlements_for_enablingl   s   r@   c                   @   s   e Zd Ze Ze ZdS )	SortOrderN)__name__
__module____qualname__objectREQUIRED_SERVICESDEPENDENT_SERVICESr&   r&   r&   r'   rA   }   s    
rA   c                 C      t | tjdS )zR
    Return the entitlements disable order based on dependent services logic.
    r   
sort_order)_sort_entitlementsrA   rG   r+   r&   r&   r'   entitlements_disable_order      rL   c                 C   rH   )zP
    Return the entitlements enable order based on required services logic.
    rI   )rK   rA   rF   r+   r&   r&   r'   r?      rM   r?   ent_clsrJ   visitedorderc                 C   s   |j |v rd S || }|tjkrdd |jD }nt|j}|D ]}|j |vr0t| ||||d q |t|j  d|t|j < d S )Nc                 S   s   g | ]}|j qS r&   )r$   )r-   er&   r&   r'   r/      s    z,_sort_entitlements_visit.<locals>.<listcomp>r   rN   rJ   rO   rP   T)	r   rA   rF   required_serviceslistdependent_services_sort_entitlements_visitappendstr)r   rN   rJ   rO   rP   r%   cls_listcls_dependencyr&   r&   r'   rV      s$   



rV   c                 C   s(   g }i }t D ]}t| ||||d q|S )NrR   )r!   rV   )r   rJ   rP   rO   rN   r&   r&   r'   rK      s   rK   r3   c                 C   sD   g }| D ]}|t |ddv r|| qtt| t| }||fS )zReturn a list of valid entitlement names.

    :param names: List of entitlements to validate
    :return: a tuple of List containing the valid and invalid entitlements
    T)r   r)   )r4   rW   r1   set)r3   r   entitlements_foundent_nameentitlements_not_foundr&   r&   r'   get_valid_entitlement_names   s   
r_   c                 C   sJ   t |d}d|}dtjd| d dddd}tjd	d| |d
S )z{
    Constructs the MESSAGE_INVALID_SERVICE_OP_FAILURE message
    based on the attempted services and valid services.
    r+   , 
zTry .P   F)widthbreak_long_wordsbreak_on_hyphensenable)	operationinvalid_serviceservice_msg)r4   jointextwrapwrapr   InvalidServiceOpError)r^   r   valid_services_namesr"   rj   r&   r&   r'   *create_enable_entitlements_not_found_error   s   


rp   c                 C   s
   t | tS r6   )
isinstancer   r:   r&   r&   r'   _is_repo_entitlement   s   
rr   c              	   C   s   t t}t| D ]e}t| |}t|sq| \}}|tjkr>|j}|j	p&d}|D ]}|j
||}	||	 |||d q)| D ]*\}
}t|dkrl|d d }|d d }tj| jdtdd	 |D ||d
qBqdS )Nr&   )fromapt_urlsuite   r   rt   ru   r`   c                 s   s    | ]}|d  V  qdS )rs   Nr&   )r-   r%   r&   r&   r'   	<genexpr>  s    z>check_entitlement_apt_directives_are_unique.<locals>.<genexpr>)urlr3   rt   ru   T)r   rT   r4   r(   rr   applicability_statusr   
APPLICABLErt   
apt_suitesrepo_policy_check_tmplformatrW   itemsr9   r   %EntitlementsAPTDirectivesAreNotUniquecontract_urlrk   r1   )r   entitlement_directivesr]   r%   ry   _rt   r{   ru   entitlement_directivedef_pathent_directiver&   r&   r'   +check_entitlement_apt_directives_are_unique   sD   


r   r]   c                 C   s,   z	t | ||djW S  tjy   | Y S w )N)r   )r(   titler   UbuntuProError)r   r]   r   r&   r&   r'   	get_title  s
   r   )r   FFN)F)r   )?enumrl   collectionsr   typingr   r   r   r   uaclientr   uaclient.configr   uaclient.entitlementsr	   uaclient.entitlements.anboxr
   uaclient.entitlements.baser   uaclient.entitlements.ccr   uaclient.entitlements.cisr   (uaclient.entitlements.entitlement_statusr   uaclient.entitlements.esmr   r   uaclient.entitlements.landscaper   uaclient.entitlements.livepatchr   uaclient.entitlements.realtimer   uaclient.entitlements.repor   uaclient.entitlements.rosr   r   uaclient.exceptionsr   FIPSEntitlementFIPSUpdatesEntitlementFIPSPreviewEntitlementr!   rX   boolr(   r4   r@   uniqueEnumrA   rL   r?   rV   rK   r_   r   rp   rr   r   r   r&   r&   r&   r'   <module>   s    

.




.