def server_bidirectional_stream_call_one_by_one():
    """
    双向流模式,客户端处理,一个请求对应一个响应的情况
    通过队列传递交互传递参数
    """
    # 清空队列
    TEMP_QUEUE.queue.clear()
    TEMP_QUEUE.put(None)

    # 处理
    _connect_para = SimpleGRpcConnection.generate_connect_para(
        ip='127.0.0.1', port=50051
    )
    _connection = SimpleGRpcConnection(_connect_para)
    _cresult_iterator = _connection.call(
        bidirectional_stream_one_by_one_generator(),
        call_mode=EnumCallMode.BidirectionalStream)
    for _cresult in _cresult_iterator:
        # 放入队列
        s = _cresult.return_json
        TEMP_QUEUE.put(s)
        if not _cresult.is_success():
            return False

    _connection.close()
    return True
def client_simple_call_para_server_tsl(a, b, *args, c=10, d={'d1': 'd1value'}, **kwargs):
    """
    测试简单调用,进行单向认证(客户端验证服务端证书)
    """
    # 转换参数
    _para_values = RunTool.get_current_function_parameter_values(is_simple_mode=True)
    _para_obj = SimpleGRpcTools.parameters_to_json(_para_values)
    _req_obj = SimpleGRpcTools.generate_request_obj(
        service_name='service_simple_call_para', para_json=_para_obj.para_json,
        has_para_bytes=_para_obj.has_para_bytes, para_bytes=_para_obj.para_bytes
    )
    # 发送请求
    with open(_TEMP_DIR + '/../../simple_grpc/server.crt', 'rb') as f:
        _root_certificates = f.read()

    # 发送请求, 默认使用全局的日志对象
    _connect_para = SimpleGRpcConnection.generate_connect_para(
        ip='localhost', port=50053, is_use_ssl=True,
        root_certificates=_root_certificates
    )
    _connection = SimpleGRpcConnection(_connect_para)
    _cresult = _connection.call(_req_obj)
    _connection.close()

    _cresult.return_obj = SimpleGRpcTools.json_to_object_by_para_mapping(
        _cresult.return_json,
        'client_simple_call_para'
    )
    return _cresult
def server_side_stream_call(a, b, *args, **kwargs):
    """
    服务端流模式,真正调用服务端的函数
    """
    # 转换参数
    _para_values = RunTool.get_current_function_parameter_values(is_simple_mode=True)
    _para_obj = SimpleGRpcTools.parameters_to_json(_para_values)
    _req_obj = SimpleGRpcTools.generate_request_obj(
        service_name='service_server_side_stream', para_json=_para_obj.para_json,
        has_para_bytes=_para_obj.has_para_bytes, para_bytes=_para_obj.para_bytes
    )

    # 发送请求, 默认使用全局的日志对象
    _connect_para = SimpleGRpcConnection.generate_connect_para(
        ip='127.0.0.1', port=50051
    )
    _connection = SimpleGRpcConnection(_connect_para)
    _cresult_iterator = _connection.call(_req_obj,
                                         call_mode=EnumCallMode.ServerSideStream)
    _ret = True
    for _cresult in _cresult_iterator:
        if not _cresult.is_success():
            _ret = False

    _connection.close()

    return _ret
    def test_error(self):
        """
        测试错误信息
        """
        if not TEST_FLAG['test_error']:
            return

        print("测试错误信息")
        print("测试错误信息 - 连接失败")
        _connect_para = SimpleGRpcConnection.generate_connect_para(
            ip='127.0.0.1', port=60051
        )
        _connection = SimpleGRpcConnection(_connect_para)
        _cresult = _connection.call(SimpleGRpcTools.generate_request_obj('test'))
        _connection.close()
        self.assertTrue(
            _cresult.code == '20408' and grpc.StatusCode.UNAVAILABLE.name == _cresult.i18n_msg_paras[0],
            '测试错误信息失败 - 连接失败 '
        )

        print("测试错误信息 - 服务名不存在")
        _connect_para = SimpleGRpcConnection.generate_connect_para(
            ip='127.0.0.1', port=50051
        )
        _connection = SimpleGRpcConnection(_connect_para)
        _cresult = _connection.call(SimpleGRpcTools.generate_request_obj('test', ''))
        _connection.close()
        self.assertTrue(
            _cresult.code == '11403',
            '测试错误信息失败 - 服务名不存在 '
        )

        print("测试错误信息 - 超时")
        _connect_para = SimpleGRpcConnection.generate_connect_para(
            ip='127.0.0.1', port=50051, timeout=0.1
        )
        _connection = SimpleGRpcConnection(_connect_para)
        _cresult = _connection.call(SimpleGRpcTools.generate_request_obj('service_simple_overtime'))
        _connection.close()
        self.assertTrue(
            _cresult.code == '30403',
            '测试错误信息失败 - 超时'
        )
def client_side_stream_call():
    """
    客户端流模式,真正调用服务端的函数
    """
    # 发送请求, 默认使用全局的日志对象
    _connect_para = SimpleGRpcConnection.generate_connect_para(
        ip='127.0.0.1', port=50051
    )
    _connection = SimpleGRpcConnection(_connect_para)
    _cresult = _connection.call(client_side_stream_generator(),
                                call_mode=EnumCallMode.ClientSideStream)
    _connection.close()

    _cresult.return_obj = SimpleGRpcTools.json_to_object_by_para_mapping(
        _cresult.return_json,
        'service_client_side_stream'
    )
    return _cresult
Esempio n. 6
0
    def _grpc_call(self,
                   service_name: str,
                   para_list: list,
                   is_support_bytes=False):
        """
        调用远程grpc服务
        注:该函数不处理返回对象中的bytes信息

        @param {str} service_name - 要调用的服务名
        @param {list} para_list - 要转换的参数列表,list的每一项为一个参数项,每个参数项如下:
            [para_name, call_value] : para_name可以为''
        @param {bool} is_support_bytes=False - 是否支持参数中的字节数组传递(只支持最后一个参数)

        @returns {object} - 返回远程调用返回的对象

        @throws {RuntimeError} - 如果远程调用出现错误抛出异常
        """
        # 生成请求对象
        _para_obj = SimpleGRpcTools.parameters_to_json(
            para_list, is_support_bytes=is_support_bytes)
        _req_obj = SimpleGRpcTools.generate_request_obj(
            service_name=service_name,
            para_json=_para_obj.para_json,
            has_para_bytes=_para_obj.has_para_bytes,
            para_bytes=_para_obj.para_bytes)

        # 连接并请求服务
        _connection = SimpleGRpcConnection(self.connect_para)
        try:
            _cresult: CResult = _connection.call(_req_obj)
            if not _cresult.is_success():
                # 执行失败,抛出异常
                raise RuntimeError('call %s error: %s' %
                                   (service_name, str(_cresult)))

            # 处理返回值
            if _cresult.return_json == '':
                return None
            else:
                return json.loads(_cresult.return_json)
        finally:
            _connection.close()
def server_bidirectional_stream_call_n_by_one():
    """
    双向流模式,客户端处理,多个请求对应一个响应的情况
    """
    # 发送请求, 默认使用全局的日志对象
    _connect_para = SimpleGRpcConnection.generate_connect_para(
        ip='127.0.0.1', port=50051
    )
    _connection = SimpleGRpcConnection(_connect_para)
    _cresult_iterator = _connection.call(bidirectional_stream_n_by_one_generator(),
                                         call_mode=EnumCallMode.BidirectionalStream)

    _ret = True
    for _cresult in _cresult_iterator:
        # 打印
        print('bidirectional_stream_n_by_one client get: ' + _cresult.return_json)
        if not _cresult.is_success():
            _ret = False

    _connection.close()
    return _ret
def client_simple_throw_excepiton():
    """
    测试简单调用,抛出异常
    """
    # 转换参数
    _para_values = RunTool.get_current_function_parameter_values(
        is_simple_mode=True)
    _para_obj = SimpleGRpcTools.parameters_to_json(_para_values)
    _req_obj = SimpleGRpcTools.generate_request_obj(
        service_name='service_simple_throw_excepiton',
        para_json=_para_obj.para_json,
        has_para_bytes=_para_obj.has_para_bytes,
        para_bytes=_para_obj.para_bytes)
    # 发送请求, 默认使用全局的日志对象
    _connect_para = SimpleGRpcConnection.generate_connect_para(
        conn_str='127.0.0.1:50051')
    _connection = SimpleGRpcConnection(_connect_para)
    _cresult = _connection.call(_req_obj)
    _connection.close()
    _cresult.return_obj = SimpleGRpcTools.json_to_object_by_para_mapping(
        _cresult.return_json, 'client_simple_throw_excepiton')
    return _cresult
def client_simple_call_para(a, b, *args, c=10, d={'d1': 'd1value'}, **kwargs):
    """
    测试简单调用,直接返回参数
    """
    # 转换参数
    _para_values = RunTool.get_current_function_parameter_values(is_simple_mode=True)
    _para_obj = SimpleGRpcTools.parameters_to_json(_para_values)
    _req_obj = SimpleGRpcTools.generate_request_obj(
        service_name='service_simple_call_para', para_json=_para_obj.para_json,
        has_para_bytes=_para_obj.has_para_bytes, para_bytes=_para_obj.para_bytes
    )
    # 发送请求, 默认使用全局的日志对象
    _connect_para = SimpleGRpcConnection.generate_connect_para(
        conn_str='127.0.0.1:50051', servicer_name='servicer_simple_call',
        test_on_connect=True, test_use_health_check=False
    )
    _connection = SimpleGRpcConnection(_connect_para)
    _cresult = _connection.call(_req_obj)
    _connection.close()
    _cresult.return_obj = SimpleGRpcTools.json_to_object_by_para_mapping(
        _cresult.return_json,
        'client_simple_call_para'
    )
    return _cresult