B
    `"                 @   s   d dl mZmZmZ eZdZd dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlmZ d dlmZ dd	gd
dddgd
ddgdd	gdZG dd deZdd ZdddZdS )    )absolute_importdivisionprint_functiona  
author: Ansible Networking Team
httpapi: nxos
short_description: Use NX-API to run commands on Cisco NX-OS platform
description:
- This plugin provides low level abstraction APIs for sending and receiving
  commands using NX-API with devices running Cisco NX-OS.
version_added: 1.0.0
N)to_text)ConnectionError)to_list)HttpApiBasetextjsonlinestrictexactnoneblockconfig)formatZ
diff_matchZdiff_replaceoutputc                   sf   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dddZdd Z  ZS )HttpApic                s"   t t| j|| d | _i | _d S )N)superr   __init___device_info_module_context)selfargskwargs)	__class__ b/home/dcms/DCMS/lib/python3.7/site-packages/ansible_collections/cisco/nxos/plugins/httpapi/nxos.pyr   '   s    zHttpApi.__init__c             C   s   | j |r| j | S d S )N)r   get)r   
module_keyr   r   r   read_module_context,   s    
zHttpApi.read_module_contextc             C   s   || j |< d S )N)r   )r   r   Zmodule_contextr   r   r   save_module_context2   s    
zHttpApi.save_module_contextc       	      K   s   d }t  }t  }xt|D ]}|dp*d}t|trP|d }d|krT|d }n|}|drr|ddd }d}|r||kr|| || t  }|}|	| qW |r|| || t
|dkr|d S |S )	Nr   r	   commandz| json|   r   r
   )listr   r   
isinstancedictendswithrsplitextend
_run_queueappendlen)	r   dataZmessage_kwargsr   queue	responsesitemZ
cmd_outputr"   r   r   r   send_request7   s.    


zHttpApi.send_requestc          	   C   s   | j r| jdd t||}ddi}| jjd||dd\}}ytt| }W n* t	k
r~   t
dt| Y nX t|}|S )	NwarningzVbecome has no effect over httpapi. Use network_cli if privilege escalation is requiredzContent-Typezapplication/jsonz/insPOST)headersmethodz$Response was not valid JSON, got {0})Z_become
connectionZqueue_messagerequest_buildersendr
   loadsr   getvalue
ValueErrorr   r   handle_response)r   r/   r   requestr5   responseZresponse_dataresultsr   r   r   r+   X   s     
zHttpApi._run_queuec             C   s  | j r| j S i }d|d< | ddg\}}dddg}x0|D ](}t||tj}|r:|d|d	< P q:W td
|tj}|r|d|d< td|tj}|r|d|d< dddg}	x0|	D ](}t||tj}
|
r|
d|d< P qW td|tj}|r
|d|d< || _ | j S )NZnxosZ
network_oszshow versionzshow inventoryz\s+system:\s+version\s*(\S+)z\s+kickstart:\s+version\s*(\S+)z\s+NXOS:\s+version\s*(\S+)r$   Znetwork_os_versionz Hardware\n\s+cisco\s*(\S+\s+\S+)Znetwork_os_modelz\s+Device name:\s*(\S+)Znetwork_os_hostnamez \s+system image file is:\s*(\S+)z#\s+kickstart image file is:\s*(\S+)z\s+NXOS image file is:\s*(\S+)Znetwork_os_imagez7NAME: (?:"Chassis"| Chassis ),\s*DESCR:.*\nPID:\s*(\S+)network_os_platform)r   r2   researchMgroup)r   device_infoZreplyZplatform_replyZfind_os_versionregexZ	match_verZmatch_chassis_idZmatch_host_nameZfind_os_imageZmatch_file_nameZmatch_os_platformr   r   r   get_device_infor   sJ    

zHttpApi.get_device_infoc             C   s8   |   dd}ddddddddddd|kr0dnddS )NrA    TFZ9K)Zsupports_diff_replaceZsupports_commitZsupports_rollbackZsupports_defaultsZsupports_onbox_diffZsupports_commit_commentZsupports_multiline_delimiterZsupports_diff_matchZsupports_diff_ignore_linesZsupports_generate_diffZsupports_replace)rH   r   )r   platformr   r   r   get_device_operations   s    zHttpApi.get_device_operationsc             C   s@   i }g |d< |   |d< |  |d< |t d|d< t|S )NZrpcrF   Zdevice_operationsZnxapiZnetwork_api)rH   rK   updateOPTIONSr
   dumps)r   resultr   r   r   get_capabilities   s    
zHttpApi.get_capabilitiesNc             C   s   | j ||dS )N)r.   r   )r2   )r   r"   r   r   r   r   r      s    zHttpApi.getc             C   s    | j |dd}dd t|D S )Nr   )r   c             S   s   g | ]}|d kr|qS )z{}r   ).0respr   r   r   
<listcomp>   s    z'HttpApi.edit_config.<locals>.<listcomp>)r2   r   )r   	candidater0   r   r   r   edit_config   s    zHttpApi.edit_config)N)__name__
__module____qualname__r   r    r!   r2   r+   rH   rK   rP   r   rU   __classcell__r   r   )r   r   r   &   s   !6
r   c             C   s   g }| d  drxt| d d d D ]}|d dkrx| dd}| dd}| d	d}td
|||f |d dq(d|kr(|d }t|trt|}||  q(W |S )Nins_apioutputsr   codeZ200inputrI   msgclierrorz
%s: %s: %s)r\   body)	r   r   r   r&   r'   r
   rN   r,   strip)r?   r@   r   Z
input_datar^   r_   rO   r   r   r   r=      s     

r=   1.00c       	   	   C   s   ddddd}| d  dd  }||krD|| }d	d
 | D } n@y|| }W n2 tk
r   d|d| f }t|Y nX t| ttt	frd| } t
 }||d< ||d< ||d< ||d< | |d< d|d< tt|dS )z)Encodes a NXAPI JSON request message
    Zcli_show_asciiZcli_showbashZcli_conf)r	   r
   rd   r   r   r#   c             S   s   g | ]}| d d  qS )r#   r   )splitra   )rQ   r"   r   r   r   rS      s    z#request_builder.<locals>.<listcomp>z/invalid format, received %s, expected one of %s,z ;versiontypechunksidr]   r
   Zoutput_format)rZ   )rf   ra   KeyErrorjoinkeysr   r&   r%   settuplecollectionsOrderedDictr
   rN   r'   )	commandsr   rh   rj   rk   Zoutput_to_command_typeZmaybe_outputZcommand_typer^   r   r   r   r8      s2    
r8   )rb   rc   N)
__future__r   r   r   ri   __metaclass__ZDOCUMENTATIONr
   rB   rq   Zansible.module_utils._textr   Zansible.module_utils.connectionr   ZOansible_collections.ansible.netcommon.plugins.module_utils.network.common.utilsr   Zansible.plugins.httpapir   rM   r   r=   r8   r   r   r   r   <module>   s"   

 ,