o
    (fD                     @   s  d dl Z 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mZmZmZmZmZ d dlmZmZ d dlmZmZmZ d dlmZmZ d dlmZ d dlm Z  d d	l!m"Z"m#Z#m$Z$ d d
l%m&Z& e'e(e)Z*edde+fde+fdeee,ef  fgZ-	dBde
j.de+dee	j/ fddZ0de
j.de,dee dee de,de,de,fddZ1de+dee,ef dee, dee, d eee,ef  d!eee,ef  de+fd"d#Z2de
j.d$e,de,de+d%e+de+d&eee,  dee dee d'e-fd(d)Z3e j4e j5e 6e j7d'e8fd*d+Z9e$d,ej:ej;e9e&j<d-e#e"dej=j>d.?ej@e
. d/d0d1d2d3e"d4ejAj>d,d5d6d7e"d8ejBd6d7e"d9ejCd6d7e"d:ejDj>d;d<d1d;d=gd;d>e"d?ejEd1d7gd@gdAZFdS )C    N)AnyDictList
NamedTupleOptional)
apiconfigcontractentitlementsevent_logger
exceptionslockmessagesstatusutil)ServiceWithDependencies_dependencies)EnableOptionsEnableResult_enable)EnabledService_enabled_services)_is_attached)cli_util)ProArgumentProArgumentGroup
ProCommand)HelpCategory_EnableOneServiceResultsuccessneeds_rebooterrorcfgaccess_onlyprogress_objectc           
   
   C   s   t |}tj| d||d}d}d}z tjdd |j|d\}}W d   n1 s,w   Y  W n tyD } zt  |d}~ww |s^|durT|j	durT|j	}	nt
j}	tjd|	dtdgg dg d	S )
a  
    Landscape gets special treatment because it currently not supported by our
    enable API. This function is a temporary workaround until we have a proper
    API for enabling landscape, which will happen after Landscape is fully
    integrated with the contracts backend.
    	landscape)called_namer#   
extra_argsFNzcli.enable._enable_landscape)lock_holder)progress)servicereason)enableddisabledreboot_requiredr   )r   ProgressWrapperr
   LandscapeEntitlementr   	RetryLockenable	Exceptionclear_lock_file_if_presentmessager   GENERIC_UNKNOWN_ISSUEr   EntitlementNotEnabledErrorr   )
r"   r#   r'   r$   r)   r%   r   fail_reasoner+    r:   5/usr/lib/python3/dist-packages/uaclient/cli/enable.py_enable_landscape/   s>   

r<   r*   all_dependenciesenabled_servicesr&   variantservice_titlec                    s  g }g }dd |D  t fdd|D d }	|	d ur/ fdd|	jD } fdd|	jD }|D ]'}
tj| jdd}t| |
}tj	j
||d	}|sQtj|d
sXtj||d	q1|D ]}t| |}tjj
||d}tj|d
sxtj||dq[t fdd|D d }|d urd urt| }t| |j}tj| jdd}tj	j
||d	}|stj|d
stj||d	d S d S d S )Nc                 S   s   g | ]}|j qS r:   name.0sr:   r:   r;   
<listcomp>f   s    z2prompt_for_dependency_handling.<locals>.<listcomp>c                 3   s    | ]
}|j  kr|V  qd S NrA   rC   )r*   r:   r;   	<genexpr>i   s    z1prompt_for_dependency_handling.<locals>.<genexpr>c                    s   g | ]
}|j  v r|j qS r:   rA   rC   enabled_service_namesr:   r;   rF   l   
    
c                    s   g | ]
}|j  vr|j qS r:   rA   rC   rI   r:   r;   rF   q   rK   z features.block_disable_on_enable)r   path_to_value)service_being_enabledincompatible_service)msg)rM   required_servicec                 3   s.    | ]}|j  kr|jr|jkr|V  qd S rG   rB   variant_enabledvariant_namerC   )r*   r?   r:   r;   rH      s    

)nextincompatible_with
depends_onr   is_config_value_truer"   r
   	get_titler   INCOMPATIBLE_SERVICEformatprompt_for_confirmationr   IncompatibleServiceStopsEnableREQUIRED_SERVICERequiredServiceStopsEnablerS   )r"   r*   r=   r>   r&   r?   r@   incompatible_servicesrequired_servicesdependenciesrN   cfg_block_disable_on_enableincompatible_service_titleuser_msgrP   required_service_titlerR   to_be_enabled_titleenabled_variant_titler:   )rJ   r*   r?   r;   prompt_for_dependency_handling[   s   	


rh   json_outputjson_responseprocessed_servicesfailed_serviceserrorswarningsc                 C   sb   | r/|   |   |rdnd|d< ||d< ||d< ||d< ||d< ttj|tjdd	 d S d S )
Nr   failureresultrk   rl   rm   rn   T)cls	sort_keys)sortprintjsondumpsr   DatetimeAwareJSONEncoder)ri   rj   rk   rl   rm   rn   r   r:   r:   r;   _print_json_output   s    	rx   ent_name
assume_yesr'   returnc	                    s  t |}	tj| |||d}
|
j |
j}t fdd|D d }|d urItjj	|d}|	|j
 |	tjj	|d tddd||j
|jddS |szt|  ||||d	 W n- tjy } z t| |	|j
 |	tjj	|d tddd dW  Y d }~S d }~ww z_|rd }nt j|d
} dkrt| |||d}ntt||d| |d}tj| d |r|	tjj	|d n	|	tjj	|d |j}|r|	tjj	dd |jD ]}|	| qtd|d dW S  tjy$ } z1|jd }|d }|d }|d }|	| |	tjj	|d tddd||||ddW  Y d }~S d }~w tjyU } z$|	|j
 |	tjj	|d tddd||j
|j|jddW  Y d }~S d }~ww )N)r?   r#   r'   c                 3   s2    | ]}|j  krr|jr|jkr|V  qd S rG   rQ   rC   	real_namer?   r:   r;   rH      s    

z&_enable_one_service.<locals>.<genexpr>)titleFr*   )typer*   r5   message_code)r   r    r!   )r&   r?   r@   )rz   r%   )r'   r$   )r*   r?   r#   )r$   r"   install)	operationTr+   coder~   additional_infor   r*   r5   r   r   )r   &create_interactive_only_print_functionr
   entitlement_factoryrB   r~   rT   r   ALREADY_ENABLEDrZ   rO   ENABLE_FAILEDr   rh   r   UbuntuProErrorLOG	exceptionCLIEnableDisableProgressr<   r   r   r   ACCESS_ENABLED_TMPLENABLED_TMPLr.   ENABLE_REBOOT_REQUIRED_TMPLr7   r   msg_code)r"   ry   r?   r#   rz   ri   r'   r>   r=   interactive_only_printent	ent_titlealready_enabledrO   r9   r)   enable_resultr    r5   r+   err_codeerr_msgerr_infor:   r|   r;   _enable_one_service   s  	

	






r   c                K   s(  g }g }g }g }t jdd}| jdk}t|}	t| dd}
| j}| j}|
r/|r/tj	ddd|	t
j zt| W n! tjtjfy\   tjd	d
d |dt
jjt
jjd Y nw t|jst }|	|j |d|j|jd t||||||dd dS t| dg }t||\}}t|j}t|j }d
}t!||D ]3}t"|||
||||#d||	}|j$r|| |j%rd
|d< qd}|| |j&dur||j& q|rd}||7 }tj'||d}|	|j |dd|j|j|j(d t)|}|*  t|||||||d |rdS dS )z^Perform the enable action on a named entitlement.

    @return: 0 on success, 1 otherwise
    F)_schema_versionr    ru   r?    --access-only	--variant)option1option2zFailed to refresh contractT)exc_infosystem)r   r5   r   )r      r*   r'   r    Nr   r   r   )+r   JSON_SCHEMA_VERSIONrZ   r   r   getattrr#   rz   r   InvalidOptionCombinationr   REFRESH_CONTRACT_ENABLEr	   refreshConnectivityErrorr   r   warningappendE_REFRESH_CONTRACT_FAILURErO   rB   r   is_attached_and_contract_validContractExpiredErrorr   rx   r
   get_valid_entitlement_namesr   r>   r   servicesorder_entitlements_for_enablingr   getr   r    r!   *create_enable_entitlements_not_found_errorr   UAContractClientupdate_activity_token)argsr"   kwargsrk   rl   rm   rn   rj   ri   r   r?   r#   rz   expired_errnamesentitlements_foundentitlements_not_foundr>   r=   retry   rp   errcontract_clientr:   r:   r;   action_enableu  s   



	









r   r2      z, r   )optionsstore+)helpactionnargsz--assume-yes)command
store_true)r   r   r   z--betaz--formatcli)defaultru   )r   r   choicesr   r   )	arguments)r   descriptionr   help_categoryhelp_positionargument_groupsrG   )Gru   loggingtypingr   r   r   r   r   uaclientr   r   r	   r
   r   r   r   r   r   r   +uaclient.api.u.pro.services.dependencies.v1r   r   %uaclient.api.u.pro.services.enable.v1r   r   r   -uaclient.api.u.pro.status.enabled_services.v1r   r   (uaclient.api.u.pro.status.is_attached.v1r   uaclient.clir   uaclient.cli.commandsr   r   r   uaclient.cli.parserr   	getLoggerreplace_top_level_logger_name__name__r   boolstrr   UAConfigAbstractProgressr<   rh   rx   r   verify_json_format_argsassert_rootassert_attached&_raise_enable_disable_unattached_errorintr   CLI_ROOT_ENABLECLI_ENABLE_DESC
QUICKSTARTCLI_ENABLE_SERVICErZ   joinvalid_servicesCLI_ASSUME_YESCLI_ENABLE_ACCESS_ONLYCLI_ENABLE_BETACLI_FORMAT_DESCCLI_ENABLE_VARIANTenable_commandr:   r:   r:   r;   <module>   s
   0
,
\


	

 #
 

