查询设备的状态 - pynvme/pynvme GitHub Wiki

pynvme在运行前需要替换内核的nvme驱动,所以在pynvme运行的时候内核是看不到NVMe测试盘的,导致其他用户态工具(譬如nvme-cli)访问不到测试盘,无法获取盘的状态。为此,pynvme通过jsonrpc提供了一系列查询驱动程序和设备状态的接口。下面这个例子通过jsonrpc接口查询当前所有qpair的状态。

def test_jsonrpc_list_qpairs(pciaddr):  #L1
    import json
    import socket  #L3

    # create the jsonrpc client
    sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    sock.connect('/var/tmp/pynvme.sock')  #L7

    def jsonrpc_call(sock, method, params=[]):  #L9
        # create and send the command
        req = {}
        req['id'] = 1234567890
        req['jsonrpc'] = '2.0'
        req['method'] = method
        req['params'] = params
        sock.sendall(json.dumps(req).encode('ascii'))

        # receive the result
        resp = json.loads(sock.recv(4096).decode('ascii'))
        assert resp['id'] == 1234567890
        assert resp['jsonrpc'] == '2.0'
        return resp['result']

    # create controller and admin queue
    nvme0 = d.Controller(d.Pcie(pciaddr))  #L25
    
    result = jsonrpc_call(sock, 'list_all_qpair')  #L27
    assert len(result) == 1  #L28
    assert result[0]['qid']-1 == 0
    
    result = jsonrpc_call(sock, 'list_all_qpair')
    assert len(result) == 1
    assert result[0]['qid']-1 == 0

    q1 = d.Qpair(nvme0, 8)
    result = jsonrpc_call(sock, 'list_all_qpair')
    assert len(result) == 2
    assert result[0]['qid']-1 == 0
    assert result[1]['qid']-1 == 1

    q2 = d.Qpair(nvme0, 8)
  • L1. 创建一个测试项目,用于测试和展示jsonrpc接口。
  • L3. 需要socket和json模块来创建jsonrpc的客户端。
  • L7. 连接到本地UNIX socket,这个socket是pynvme运行时创建的。
  • L9. 定义jsonrpc的调用方法,发送命令和参数,获取返回的json结构体。
  • L25. 创建一个Controller对象,同时会初始化Admin Queue。
  • L27. 发送jsonrpc调用,获取当前所有qpair的信息。
  • L28. 现在应该只有1个qpair,对应Admin Queue。

jsonrpc接口提供了其他进程、应用或者机器获取pynvme测试状态的方法,譬如我们实现了一个VSCode插件用来呈现测试盘的状态。 pynvme在VSCode里面的插件

​下一步,我们会基于浏览器和Web技术实现一个完整的pynvme前端应用,用来控制多个pynvme节点上面的所有设备和测试,并查看测试的实时状态和历史记录。

这个系列的pynvme介绍到这里就结束了。我们给出了一些典型的pynvme测试脚本,并且把pynvme的细节和特性融合到这些测试脚本中展现给大家。我们希望能提供给NVMe SSD开发工程师和测试工程师一个有用、好用、易用的环境,鼓励大家开发自己需要的测试脚本。我们也会持续开发一些常用的测试脚本分享给大家。

本系列的所有文章都在github上,欢迎大家访问、留言、点赞、打赏。:) 谢谢!