o
    åÅecR  ã                   @   s¨   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Zd dl
Zd dlZd dlZejjZej d¡ZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )	é    NÚjsonrpcc                   @   s°   e Zd ZdZdZdZdZedededediZd	d
„ ZdZ	e
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZdd„ Zdd„ Ze
dd„ ƒZdd„ Zdd „ Zd!S )"ÚMessager   é   é   é   ÚrequestÚnotificationÚreplyÚerrorc                 C   s(   || _ || _|| _|| _|| _|| _d S ©N)ÚtypeÚmethodÚparamsÚresultr
   Úid)ÚselfÚtype_r   r   r   r
   r   © r   ú-/usr/lib/python3/dist-packages/ovs/jsonrpc.pyÚ__init__+   s   
zMessage.__init__c                  C   s   t j} t  jd7  _| S ©Nr   )r   Ú_next_id)Úthis_idr   r   r   Ú
_create_id5   s   zMessage._create_idc                 C   s   t t j| |d d t  ¡ ƒS r   )r   Ú	T_REQUESTr   ©r   r   r   r   r   Úcreate_request;   s   ÿzMessage.create_requestc                 C   s   t t j| |d d d ƒS r   )r   ÚT_NOTIFYr   r   r   r   Úcreate_notify@   s   ÿzMessage.create_notifyc                 C   s   t t jd d | d |ƒS r   )r   ÚT_REPLY)r   r   r   r   r   Úcreate_replyE   ó   zMessage.create_replyc                 C   s   t t jd d d | |ƒS r   )r   ÚT_ERROR)r
   r   r   r   r   Úcreate_errorI   r!   zMessage.create_errorc                 C   s
   t j|  S r   )r   Ú_Message__types)r   r   r   r   Útype_to_stringM   s   
zMessage.type_to_stringc                 C   s<   |d u|dkkr
d S t  | j¡}|rd}nd}d|||f S )Nr   Úmustzmust notz%s %s have "%s")r   r%   r   )r   ÚvalueÚnameÚ	must_haveÚ	type_nameÚverbr   r   r   Ú__validate_argQ   s   zMessage.__validate_argc                 C   s´   | j d urt| j tƒsdS tjdtjdtjdtjdi | j	¡}|d u r(d| j	 S |  
| jd|d@ ¡pY|  
| j d	|d
@ ¡pY|  
| jd|d@ ¡pY|  
| jd|d@ ¡pY|  
| jd|d@ ¡S )Nz"params" must be JSON arrayi i  i  é   z invalid JSON-RPC message type %sr   i   r   é   r   é   r
   é   r   r   )r   Ú
isinstanceÚlistr   r   r   r   r"   Úgetr   Ú_Message__validate_argr   r   r
   r   )r   Úpatternr   r   r   Úis_valid\   s(   ýý
ÿþýûzMessage.is_validc           	      C   sä   t | tƒsdS t| ƒ} d| v r|  d¡}t |tƒsdS nd }|  dd ¡}|  dd ¡}|  dd ¡}|  dd ¡}t| ƒrBd|  ¡ d	  S |d urJtj}n|d urRtj}n|d urZtj	}ntj
}t||||||ƒ}| ¡ }|d urp|S |S )
Nzmessage is not a JSON objectr   zmethod is not a JSON stringr   r   r
   r   z"message has unexpected member "%s"r   )r1   ÚdictÚpopÚstrÚlenÚpopitemr   r   r"   r   r   r6   )	Újsonr   r   r   r
   Úid_Úmsg_typeÚmsgÚvalidation_errorr   r   r   Ú	from_jsonn   s6   


ÿzMessage.from_jsonc                 C   s   i }| j d ur| j |d< | jd ur| j|d< | jd us!| jtjkr&| j|d< | jd us1| jtjkr6| j|d< | jd usA| jtj	krF| j|d< |S )Nr   r   r   r
   r   )
r   r   r   r   r   r"   r
   r   r   r   )r   r<   r   r   r   Úto_json”   s   






zMessage.to_jsonc                 C   sº   t  | j¡g}| jd ur| d| j ¡ | jd ur%| dtj | j¡ ¡ | j	d ur6| dtj | j	¡ ¡ | j
d urG| dtj | j
¡ ¡ | jd urX| dtj | j¡ ¡ d |¡S )Nzmethod="%s"zparams=zresult=zerror=zid=z, )r   r%   r   r   Úappendr   Úovsr<   Ú	to_stringr   r
   r   Újoin)r   Úsr   r   r   Ú__str__¨   s   





zMessage.__str__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r"   r$   r   r   Ústaticmethodr   r   r   r    r#   r%   r4   r6   rA   rB   rH   r   r   r   r   r       s<    ý






%r   c                   @   sŒ   e Z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„ Z
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!S )"Ú
Connectionc                 C   s0   |j | _ || _d| _d| _d| _d | _d| _d S ©Nr   Ú )r(   ÚstreamÚstatusÚinputÚoutputÚparserÚreceived_bytes)r   rP   r   r   r   r   ¸   s   
zConnection.__init__c                 C   s   | j  ¡  d | _ d S r   )rP   Úclose©r   r   r   r   rV   Á   s   

zConnection.closec                 C   s†   | j rd S t| jƒrA| j | j¡}|dkr| j|d … | _n|tj kr8t d| j	t
 | ¡f ¡ |  | ¡ d S t| jƒs
d S d S )Nr   z%s: send error: %s)rQ   r:   rS   rP   ÚsendÚerrnoÚEAGAINÚvlogÚwarnr(   ÚosÚstrerrorr
   )r   Úretvalr   r   r   ÚrunÅ   s   
ÿ÷zConnection.runc                 C   s4   | j s| j |¡ t| jƒr| j |¡ d S d S d S r   )rQ   rP   Úrun_waitr:   rS   Ú	send_wait©r   Úpollerr   r   r   ÚwaitÔ   s   
ýzConnection.waitc                 C   ó   | j S r   )rQ   rW   r   r   r   Ú
get_statusÚ   ó   zConnection.get_statusc                 C   s   | j dkrdS t| jƒS ©Nr   )rQ   r:   rS   rW   r   r   r   Úget_backlogÝ   s   

zConnection.get_backlogc                 C   rf   r   )rU   rW   r   r   r   Úget_received_bytesã   rh   zConnection.get_received_bytesc                 C   s&   t  ¡ rt  d| j||f ¡ d S d S )Nz	%s: %s %s)r[   Údbg_is_enabledÚdbgr(   )r   Útitler?   r   r   r   Ú	__log_msgæ   s   ÿzConnection.__log_msgc                 C   sR   | j r| j S |  d|¡ t| jƒdk}|  jtj | ¡ ¡7  _|r&|  ¡  | j S )NrX   r   )	rQ   Ú_Connection__log_msgr:   rS   rD   r<   rE   rB   r`   )r   r?   Ú	was_emptyr   r   r   rX   ê   s   zConnection.sendc                 C   sP   |   |¡}|r	|S 	 |  ¡  |  ¡ r|  ¡ r| jS tj ¡ }|  |¡ | 	¡  q
r   )
rX   r`   rj   rg   rQ   rD   rd   ÚPollerre   Úblock)r   r?   r
   rd   r   r   r   Ú
send_blockö   s   


ùzConnection.send_blockc                 C   sŠ  | j r| j d fS t d¡ƒ }	 | js}| j d¡\}}|r2|s2z| |¡}W n ty1   tj	}Y nw |rat
jdkrA|tjkrAtj}|tjkrJ|d fS t d| jt |¡f ¡ |  |¡ | j d fS |sl|  t¡ td fS |  j|7  _|  jt|ƒ7  _nG| jd u rˆtj ¡ | _tjjtjjkr£| j d¡| j | j¡d …  ¡ | _n| j| j | j¡d … | _| j ¡ rÄ|   ¡ }|r¿d|fS | j d fS q)Nzutf-8Tr.   Úwin32z%s: receive error: %sr   )!rQ   ÚcodecsÚgetincrementaldecoderrR   rP   ÚrecvÚdecodeÚUnicodeErrorrY   ÚEILSEQÚsysÚplatformÚWSAEWOULDBLOCKrZ   r[   r\   r(   r]   r^   r
   ÚEOFrU   r:   rT   rD   r<   ÚParserÚPARSERÚPARSER_CÚencodeÚfeedÚis_doneÚ_Connection__process_msg)r   Údecoderr
   Údatar?   r   r   r   rx     sV   

ÿ


ÿ




ÿÿ

ÔzConnection.recvc                 C   sP   	 |   ¡ \}}|tjkr||fS |  ¡  tj ¡ }|  |¡ |  |¡ | 	¡  qr   )
rx   rY   rZ   r`   rD   rd   rr   re   Ú	recv_waitrs   )r   r
   r?   rd   r   r   r   Ú
recv_block7  s   



özConnection.recv_blockc                 C   s`   |j }|  |¡}d }|s,|  ¡ \}}|r*|jtjks |jtjkr*|j |kr*	 ||fS |r||fS r   )r   rX   rŠ   r   r   r   r"   )r   r   r=   r
   r	   r   r   r   Útransact_blockD  s   

ùzConnection.transact_blockc                 C   s†   | j  ¡ }d | _ t|tƒrt d| j|f ¡ |  tj	¡ d S t
 |¡}t|t
ƒs;t d| j|f ¡ |  tj	¡ d S |  d|¡ |S )Nz%s: error parsing stream: %sz%%s: received bad JSON-RPC message: %sÚreceived)rT   Úfinishr1   r9   r[   r\   r(   r
   rY   ÚEPROTOr   rA   rp   )r   r<   r?   r   r   r   Ú__process_msgR  s   



ÿzConnection.__process_msgc                 C   s(   | j s| jr| ¡  d S | j |¡ d S r   )rQ   rR   Úimmediate_wakerP   r‰   rc   r   r   r   r‰   f  s   zConnection.recv_waitc                 C   s(   | j dkr|| _ | j ¡  d| _d S d S rN   )rQ   rP   rV   rS   )r   r
   r   r   r   r
   l  s
   


ýzConnection.errorN)rI   rJ   rK   r   rV   r`   re   rg   rj   rk   rp   rX   rt   rx   rŠ   r‹   r†   r‰   r
   r   r   r   r   rM   ·   s"    	3rM   c                   @   sÈ   e Zd ZdZdd„ Zed-dd„ƒZed-dd„ƒZe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„ Z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,„ ZdS ).ÚSessionz%A JSON-RPC session with reconnection.c                 C   sL   || _ || _d | _d | _d| _t|ƒtur|g}|| _t 	| j¡ d| _
d S ri   )Ú	reconnectÚrpcrP   ÚpstreamÚseqnor   r2   ÚremotesÚrandomÚshuffleÚnext_remote)r   r’   r“   r–   r   r   r   r   v  s   
zSession.__init__Nc                 C   s   t j| g|dS )a=  Creates and returns a Session that maintains a JSON-RPC session to
        'name', which should be a string acceptable to ovs.stream.Stream or
        ovs.stream.PassiveStream's initializer.

        If 'name' is an active connection method, e.g. "tcp:127.1.2.3", the new
        session connects and reconnects, with back-off, to 'name'.

        If 'name' is a passive connection method, e.g. "ptcp:", the new session
        listens for connections to 'name'.  It maintains at most one connection
        at any given time.  Any new connection causes the previous one (if any)
        to be dropped.

        If "probe_interval" is zero it disables the connection keepalive
        feature. If non-zero the value will be forced to at least 1000
        milliseconds. If None it will just use the default value in OVS.
        )Úprobe_interval)r‘   Úopen_multiple)r(   rš   r   r   r   Úopen‚  s   zSession.openc                 C   sœ   t j t j ¡ ¡}t|d | ƒ}| ¡  | t j ¡ ¡ | t	| ƒ¡ t j
j | ¡ ¡r4| dt j ¡ ¡ t j
 | ¡ ¡sC| d¡ |S |d urL| |¡ |S ©NTr   )rD   r’   Ú	ReconnectÚtimevalÚmsecr‘   Úpick_remoteÚenableÚset_backoff_free_triesr:   rP   ÚPassiveStreamÚis_valid_nameÚget_nameÚset_passiveÚstream_or_pstream_needs_probesÚset_probe_interval)r–   rš   r’   Úsessionr   r   r   r›   –  s   
ý
zSession.open_multiplec                 C   sR   t j t j ¡ ¡}t|d | jgƒ}| d¡ | ¡  | 	d¡ | 
t j ¡ ¡ |S r   )rD   r’   rž   rŸ   r    r‘   r(   Ú	set_quietr¡   Úset_max_triesÚ	connected)r   r’   rª   r   r   r   Úopen_unreliably§  s   

zSession.open_unreliablyc                 C   s.   | j  | j| j ¡ | jd t| jƒ | _d S r   )r’   Úset_namer–   r™   r:   rW   r   r   r   r¡   ±  s   zSession.pick_remotec                 C   sV   | j d ur| j  ¡  d | _ | jd ur| j ¡  d | _| jd ur)| j ¡  d | _d S d S r   )r“   rV   rP   r”   rW   r   r   r   rV   µ  s   






þzSession.closec                 C   sb   | j d ur| j  t¡ | j  ¡  d | _ n| jd ur"| j ¡  d | _nd S |  jd7  _|  ¡  d S r   )r“   r
   r   rV   rP   r•   r¡   rW   r   r   r   Ú__disconnectÀ  s   



zSession.__disconnectc                 C   sÐ   |   ¡  | j ¡ }| j ¡ s6tjj |¡\}| _|s$| j tj	 
¡ ¡ n;| j tj	 
¡ |¡ d | _|  ¡  n)| jd u r_tjj |¡\}| _|sQ| j tj	 
¡ ¡ n| j tj	 
¡ |¡ |  ¡  |  jd7  _d S r   )Ú_Session__disconnectr’   r¦   Ú
is_passiverD   rP   ÚStreamrœ   Ú
connectingrŸ   r    Úconnect_failedr¡   r”   r¤   Ú	listeningr•   )r   r(   r
   r   r   r   Ú	__connectÎ  s    



zSession.__connectc                 C   s$  | j d urJ| j  ¡ \}}|dkr3| js| jr$t d| j ¡  ¡ |  ¡  | j 	t
j ¡ ¡ t|ƒ| _n|tjkrJ| j t
j ¡ |¡ | j  ¡  d | _ | jr| j ¡ }| j ¡  | j ¡ |k rg| j t
j ¡ ¡ | j ¡ }|dkr~| j t
j ¡ |¡ |  ¡  nA| jd urÀ| j ¡  | j ¡ }|dkr¥| j 	t
j ¡ ¡ t| jƒ| _d | _n|tjkrÀ| j t
j ¡ |¡ |  ¡  | j ¡  d | _| j t
j ¡ ¡}|t
jjkrÕ|  ¡  d S |t
jjkrë| j t
j ¡ d¡ |  ¡  d S |t
jjkr	| jrt dg ¡}d|_ | j !|¡ d S d S |d u sJ ‚d S )Nr   z.%s: new connection replacing active connectionÚecho)"r”   Úacceptr“   rP   r[   Úinfor’   r¦   r±   r­   rD   rŸ   r    rM   rY   rZ   Úlisten_errorrV   rj   r`   Úactivityrg   ÚdisconnectedÚconnectrµ   r¡   ÚCONNECTÚ_Session__connectÚ
DISCONNECTÚPROBEr   r   r   rX   )r   r
   rP   ÚbacklogÚactionr   r   r   r   r`   ä  sb   
ÿ




€




ýzSession.runc                 C   sh   | j d ur| j  |¡ n| jd ur| j |¡ | j |¡ | jd ur(| j |¡ | j |tj 	¡ ¡ d S r   )
r“   re   rP   ra   Úconnect_waitr”   r’   rD   rŸ   r    rc   r   r   r   re      s   


zSession.waitc                 C   s   | j d ur
| j  ¡ S dS ri   )r“   rj   rW   r   r   r   rj   *  s   

zSession.get_backlogc                 C   s
   | j  ¡ S r   )r’   r¦   rW   r   r   r   r¦   0  ó   
zSession.get_namec                 C   s   | j d ur| j  |¡S tjS r   )r“   rX   rY   ÚENOTCONN)r   r?   r   r   r   rX   3  s   
zSession.sendc                 C   sª   | j d urS| j  ¡ }| j  ¡ \}}tj ¡ }| j |¡ || j  ¡ kr)| j |¡ |sS|j	t
jkrC|jdkrC|  t
 |j|j¡¡ d S |j	t
jkrQ|jdkrQ	 d S |S d S )Nr¸   )r“   rk   rx   rD   rŸ   r    r’   Úreceive_attemptedr¼   r   r   r   r   rX   r    r   r   r   )r   rU   r
   r?   Únowr   r   r   rx   9  s    


ûÿzSession.recvc                 C   s   | j d ur| j  |¡ d S d S r   )r“   r‰   rc   r   r   r   r‰   S  s   
ÿzSession.recv_waitc                 C   s2   | j d us
| jd urdS | j ¡ }|d u p|dkS r   )r“   rP   r’   Úget_max_tries)r   Ú	max_triesr   r   r   Úis_aliveW  s   
zSession.is_alivec                 C   s
   | j d uS r   )r“   rW   r   r   r   Úis_connected^  rÆ   zSession.is_connectedc                 C   rf   r   )r•   rW   r   r   r   Ú	get_seqnoa  rh   zSession.get_seqnoc                 C   s   | j  tj ¡ ¡ d S r   )r’   Úforce_reconnectrD   rŸ   r    rW   r   r   r   rÏ   d  s   zSession.force_reconnectc                 C   s*   t | jƒ}|  ¡ r|d7 }| j |¡ dS )zÑ Resets the reconnect backoff by allowing as many free tries as the
        number of configured remotes.  This is to be used by upper layers
        before calling force_reconnect() if backoff is undesirable.r   N)r:   r–   rÍ   r’   r£   )r   Ú
free_triesr   r   r   Úreset_backoffg  s   
zSession.reset_backoffc                 C   s
   t | jƒS r   )r:   r–   rW   r   r   r   Úget_num_of_remotest  rÆ   zSession.get_num_of_remotesr   )rI   rJ   rK   Ú__doc__r   rL   rœ   r›   r®   r¡   rV   r±   rÀ   r`   re   rj   r¦   rX   rx   r‰   rÌ   rÍ   rÎ   rÏ   rÑ   rÒ   r   r   r   r   r‘   s  s4    
	<
r‘   )rv   rY   r]   r—   r|   Úovs.jsonrD   Ú
ovs.pollerÚovs.reconnectÚ
ovs.streamÚovs.timevalÚovs.utilÚovs.vlogÚutilr   r[   ÚVlogÚobjectr   rM   r‘   r   r   r   r   Ú<module>   s&     =