ovs/jsonrpc.py
Connection
:维护与 ovsdb 的连接,用于与 ovsdb 通信。Message
:封装与 ovsdb 通信所使用的消息Session
:
class Connection(object):
def __init__(self, stream):
self.name = stream.name
self.stream = stream
self.status = 0
self.input = ""
self.output = ""
self.parser = None
self.received_bytes = 0
- 属性说明:
name
:链接的名称stream
:封装 socket 的Stream
的实例status
:链接的状态(0为正常,负数为不正常)。input
:从 ovsdb 接收到的消息output
:准备向 ovsdb 发送的消息parser
:json 解析器,负责解析从 ovsdb 接受到的数据。received_bytes
:从 ovsdb 接受到的数据的字节数的大小
关闭与 OVSDB 的连接
日志记录
记录错误消息,并关闭 stream 的链接
循环发送 output
内的数据,直至发送完毕。发送完毕的同时会清空 output
。
调用 run
来发送以 Message
封装的消息。
调用 send
发送 request 中包含的消息,调用 recv_block
接受消息
不停的调用 recv
来接受消息,直到消息接受完成
调用 stream.recv
来接收消息。
将从 ovsdb 接受到的 json 数据解析完成后转化为 Message
封装的格式。
与 OVSDB 通讯的消息封装(JSON-RPC)。
T_REQUEST = 0 # Request.
T_NOTIFY = 1 # Notification.
T_REPLY = 2 # Successful reply.
T_ERROR = 3 # Error reply.
__types = {T_REQUEST: "request",
T_NOTIFY: "notification",
T_REPLY: "reply",
T_ERROR: "error"}
_next_id = 0
消息的类型分为四种:请求消息、通知消息;成功回复、错误回复。
id:代表了本次请求的 id
def __init__(self, type_, method, params, result, error, id):
self.type = type_
self.method = method
self.params = params
self.result = result
self.error = error
self.id = id
@staticmethod
def _create_id():
this_id = Message._next_id
Message._next_id += 1
return this_id
创建一个请求消息。
method
:请求调用 OVSDB 的方法
params
:请求方法的参数
创建一个通知消息。
method
:通知调用 OVSDB 的方法
params
:通知方法的参数
创建一个回复消息(result
)。
创建一个错误消息(error
)。
@staticmethod
def type_to_string(type_):
return Message.__types[type_]
将封装的消息(Message
)转化为 json 格式
将一个 json 格式(dict)消息,封装为 Message
格式
验证 Message 封装的消息是否合法
def __init__(self, reconnect, rpc):
self.reconnect = reconnect
self.rpc = rpc
self.stream = None
self.pstream = None
self.seqno = 0
- 参数说明:
reconnect
:FSM 实例rpc
:通过监听连接来创建(与 pstream 配合使用)stream
:建立并维持与 ovsdb server 的连接,然后用 rpc 进行封装。pstream
:建立在本机的监听,当有连接请求进来时,在连接的基础上创建 rpc 实例。
- 解析
- FSM 用来维持 session 中连接的状态
- session 中的连接有两种状态:一种是主动去连接 server 端,通过 stream 实现;一种是在本机建立监听(pstream),当有请求进来时,与之建立连接
- session 中的两种连接都要用 rpc 进行封装,方便与 server 进行通讯
seqno
:序号,建立连接时序号增加,取消连接时序号增加
静态方法。根据 name 创建一个 FSM,在此 FSM 的基础上创建一个 Session 实例。
在已有的 rpc 基础上创建 Session 实例。
是否建立连接(是否有 rpc 的存在)
关闭所有存在的连接和监听
业务处理方法。
- 对于
pstream
来说,接受连接申请,创建 rpc - 对于
stream
来说,主动去连接 server 创建 rpc - 对于
rpc
来说,执行与 server 通讯的任务。
根据 FSM 的反馈,判断下一步要进行的动作。
- 若需要进行连接,则调用
__connect
方法 - 若需要断开连接,则调用
__disconnect
方法 - 若需要 PROBE ,则调用
self.rpc
调用 server 端的 echo 方法
断开与 server 端的连接
建立与 server 端的连接
- 若 FSM 为非 passive 模式,则创建一个
Stream
对象 - 若 FSM 为 passive 模式,则创建一个
PassiveStream
对象
阻塞等待,直到有消息发送或者接收。
准备向 server 端发送消息的大小
调用 rpc 发送 msg 消息
接受从 server 端回复的消息
等待有可接收的消息
检查是否有与 server 端的连接存在。
强制 FSM 改变到 Reconnect
状态,从而引发与 server 端连接的重置。