o
    ÙKÕi&  ã                   @   sÎ  d dl Z d dlmZmZmZmZmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZ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mZmZm Z m!Z! e  "e #e$¡¡Z%G dd„ deƒZ&G dd„ deeƒZ'dededej(deeej(  de)deej(ee f fdd„Z*dedee+ fdd„Z,	d.de&dee de'fdd„Z-	d.de&dedee de'fdd„Z.edd e.e&d!d"�Z/d#d!d$e'ej0d%fej1d&fej2d'fej3d(fej4d)fej5d*fgd+d,d-œZ6dS )/é    N)ÚIterableÚListÚOptionalÚTupleÚType)ÚentitlementsÚlockÚmessagesÚstatusÚutil)ÚAbstractProgressÚProgressWrapperÚ
exceptions)ÚAPIEndpoint)ÚAdditionalInfoÚErrorWarningObject)Ú_enabled_services)Ú_is_attached)ÚUAConfig)ÚBoolDataValueÚ
DataObjectÚFieldÚStringDataValueÚ	data_listc                   @   sZ   e Zd Zededd�ededdd�ededdd�gZd	dd
œdedee de	fdd„Z
d	S )ÚEnableOptionsÚservicezPro service to be enabled©ÚdocÚvariantFz2Optional variant of the Pro service to be enabled.Úaccess_onlyz^If true and the target service supports it, only enable access to the service (default: false)N)r   r   c                C   s   || _ || _|| _d S ©N)r   r   r   )Úselfr   r   r   © r"   úG/usr/lib/python3/dist-packages/uaclient/api/u/pro/services/enable/v1.pyÚ__init__*   s   
zEnableOptions.__init__)Ú__name__Ú
__module__Ú__qualname__r   r   r   ÚfieldsÚstrr   Úboolr$   r"   r"   r"   r#   r      s0    üûøûýüûr   c                	   @   sr   e Zd Zedeeƒdd�edeeƒdd�ededd�edeeƒd	d�gZdee	 dee	 de
dee	 fd
d„ZdS )ÚEnableResultÚenabledz#List of services that were enabled.r   Údisabledz$List of services that were disabled.Úreboot_requiredz?True if one of the services that was enabled requires a reboot.r	   zaList of information message strings about the service that was just enabled. Possibly translated.c                C   s   || _ || _|| _|| _d S r    ©r,   r-   r.   r	   )r!   r,   r-   r.   r	   r"   r"   r#   r$   T   s   
zEnableResult.__init__N)r%   r&   r'   r   r   r   r   r(   r   r)   r*   r$   r"   r"   r"   r#   r+   6   s>    ýýüüíýüûúr+   ÚcfgÚprogressÚentitlementÚavailable_variantsr   Úreturnc           	      C   sÎ   d }|D ]}|| |d�}|  ¡ d tjjkr| ¡ r|} nq|d u r/|jd ur/|j| |d�}|d urc| dtjdt	j
jt	jj|j t	jj d�ifg¡ t	jj|jd�}|t|j|jd|jid�fS |d fS )	N)r0   r   r   Úmessage_operationÚmsg)r   )Úvariant_namer7   )ÚtitleÚcodeÚmeta)Úapplicability_statusr   ÚApplicabilityStatusÚ
APPLICABLEÚvariant_auto_selectÚdefault_variantÚemitr   Úprompt_for_confirmationr	   ÚAUTO_SELECTING_VARIANTÚformatÚTxtColorÚBOLDr7   ÚENDCÚAUTO_SELECTED_VARIANT_WARNINGr   r6   Úname)	r0   r1   r2   r3   r   r   Úv_clsÚvÚwarningr"   r"   r#   Ú_auto_select_variantb   sJ   
ÿþ€ÿþÿÿþÿþÿýrL   c                 C   s   dd„ t | ƒjD ƒS )Nc                 S   s   g | ]}|j ‘qS r"   )rH   ©Ú.0Úsr"   r"   r#   Ú
<listcomp>’   s    z+_enabled_services_names.<locals>.<listcomp>)r   Úenabled_services©r0   r"   r"   r#   Ú_enabled_services_names‘   s   rS   ÚoptionsÚprogress_objectc                 C   s   t | tƒ |d�S )N)rU   )Ú_enabler   )rT   rU   r"   r"   r#   Úenable•   s   rW   c              
      s  t |ƒ}g }t ¡ st ¡ ‚t|ƒjst ¡ ‚ˆ jdkr t 	¡ ‚t
|ƒ}t‡ fdd„t|ƒjD ƒdƒ}|r=tg g dg d�S tj|ˆ jˆ jpFdˆ jd�}| ¡ \}}	|j}
t|tjjk|j |
gƒrvt||||
 ¡ ˆ jd	�\}}|rv| |¡ | ¡ |_d}d}ztjd
d�� |  |¡\}}W d  ƒ n1 s˜w   Y  W n t!y° } zt "¡  |‚d}~ww |sË|durÀ|j#durÀ|j#}nt$j%}tj&ˆ j|d�‚t
|ƒ}dd„ |j' (dg ¡pÚg D ƒ}t)j)|d� | *¡  tt+t,t-|ƒ .t-|ƒ¡ƒƒt+t,t-|ƒ .t-|ƒ¡ƒƒ| /¡ |d�}||_0|S )z›
    Enable a Pro service. This will automatically disable incompatible services
    and enable required services that that target service depends on.
    Ú	landscapec                 3   s8   � | ]}|j ˆ jkrˆ jr|jr|jˆ jkr|V  qd S r    )rH   r   r   Úvariant_enabledr7   rM   ©rT   r"   r#   Ú	<genexpr>³   s   € þýûúz_enable.<locals>.<genexpr>NFr/   Ú )r0   rH   r   r   )r0   r1   r2   r3   r   zu.pro.services.enable.v1)Úlock_holder)r   Úreasonc                 S   s   g | ]	}t |tƒr|‘qS r"   )Ú
isinstancer)   )rN   r6   r"   r"   r#   rP   ú   s    ýÿz_enable.<locals>.<listcomp>Úpost_enablerR   )1r   r   Úwe_are_currently_rootr   ÚNonRootUserErrorr   Úis_attachedÚUnattachedErrorr   ÚNotSupportedrS   Únextr   rQ   r+   r   Úentitlement_factoryr   r   r;   ÚvariantsÚallr<   r=   Ú
is_variantrL   ÚvaluesÚappendÚcalculate_total_enable_stepsÚtotal_stepsr   Ú	RetryLockrW   Ú	ExceptionÚclear_lock_file_if_presentÚmessager	   ÚGENERIC_UNKNOWN_ISSUEÚEntitlementNotEnabledErrorÚ	messagingÚgetr
   ÚfinishÚsortedÚlistÚsetÚ
differenceÚ_check_for_rebootÚwarnings)rT   r0   rU   r1   r}   Úenabled_services_beforeÚalready_enabledr2   ÚapplicabilityÚ_r3   Úauto_select_warningÚsuccessÚfail_reasonÚer^   Úenabled_services_afterÚpost_enable_messagesÚresultr"   rZ   r#   rV   ›   sº   	


þ	öüü
ýÿ
û

ÿý€€þÿþÿÿÿÿÿÿðrV   Úv1ÚEnableServiceT)ÚversionrH   ÚfnÚoptions_clsÚsupports_progressÚ32zw
from uaclient.api.u.pro.services.enable.v1 import enable, EnableOptions
result = enable(EnableOptions(service="usg"))
zWhen called as non-root userzCWhen called on a machine that is not attached to a Pro subscriptionz_When called for a service that doesn't support being enabled via API (currently only Landscape)zxWhen the service argument is not a valid Pro service name or if the variant is not a valid variant of the target servicez8When another Ubuntu Pro related operation is in progressz When the service fails to enablez3pro api u.pro.services.enable.v1 --args service=usgzp
{
    "disabled": [],
    "enabled": [
        "usg"
    ],
    "messages": [],
    "reboot_required": false
}
)Úintroduced_inÚrequires_networkÚexample_pythonÚresult_classr   Úexample_cliÚexample_jsonr    )7ÚloggingÚtypingr   r   r   r   r   Úuaclientr   r   r	   r
   r   Úuaclient.apir   r   r   Úuaclient.api.apir   Úuaclient.api.data_typesr   r   Ú-uaclient.api.u.pro.status.enabled_services.v1r   Ú(uaclient.api.u.pro.status.is_attached.v1r   Úuaclient.configr   Úuaclient.data_typesr   r   r   r   r   Ú	getLoggerÚreplace_top_level_logger_namer%   ÚLOGr   r+   ÚUAEntitlementr*   rL   r)   rS   rW   rV   Úendpointrb   rd   re   ÚEntitlementNotFoundErrorÚLockHeldErrorrt   Ú_docr"   r"   r"   r#   Ú<module>   s˜     ,ÿþýüû
ú/ÿÿÿ
þ	ýÿþý
ü~û	ýýýþþå 
×