fix(ocpp): return correct current_connections number of listenrs http api
This commit is contained in:
parent
75632bb2cd
commit
d7ebecddb4
|
@ -247,9 +247,10 @@ page_params(Qs) ->
|
||||||
get_cluster_listeners_info(GwName) ->
|
get_cluster_listeners_info(GwName) ->
|
||||||
Listeners = emqx_gateway_conf:listeners(GwName),
|
Listeners = emqx_gateway_conf:listeners(GwName),
|
||||||
ListenOns = lists:map(
|
ListenOns = lists:map(
|
||||||
fun(#{id := Id} = Conf) ->
|
fun(#{id := Id, type := Type0} = Conf) ->
|
||||||
|
Type = binary_to_existing_atom(Type0),
|
||||||
ListenOn = emqx_gateway_conf:get_bind(Conf),
|
ListenOn = emqx_gateway_conf:get_bind(Conf),
|
||||||
{Id, ListenOn}
|
{Type, Id, ListenOn}
|
||||||
end,
|
end,
|
||||||
Listeners
|
Listeners
|
||||||
),
|
),
|
||||||
|
@ -293,17 +294,11 @@ listeners_cluster_status(Listeners) ->
|
||||||
do_listeners_cluster_status(Listeners) ->
|
do_listeners_cluster_status(Listeners) ->
|
||||||
Node = node(),
|
Node = node(),
|
||||||
lists:foldl(
|
lists:foldl(
|
||||||
fun({Id, ListenOn}, Acc) ->
|
fun({Type, Id, ListenOn}, Acc) ->
|
||||||
BinId = erlang:atom_to_binary(Id),
|
{Running, Curr} = current_listener_status(Type, Id, ListenOn),
|
||||||
{ok, #{<<"max_connections">> := Max}} = emqx_gateway_conf:listener(BinId),
|
{ok, #{<<"max_connections">> := Max}} = emqx_gateway_conf:listener(
|
||||||
{Running, Curr} =
|
erlang:atom_to_binary(Id)
|
||||||
try esockd:get_current_connections({Id, ListenOn}) of
|
),
|
||||||
Int -> {true, Int}
|
|
||||||
catch
|
|
||||||
%% not started
|
|
||||||
error:not_found ->
|
|
||||||
{false, 0}
|
|
||||||
end,
|
|
||||||
Acc#{
|
Acc#{
|
||||||
Id => #{
|
Id => #{
|
||||||
node => Node,
|
node => Node,
|
||||||
|
@ -319,6 +314,24 @@ do_listeners_cluster_status(Listeners) ->
|
||||||
Listeners
|
Listeners
|
||||||
).
|
).
|
||||||
|
|
||||||
|
current_listener_status(Type, Id, _ListenOn) when Type =:= ws; Type =:= wss ->
|
||||||
|
Info = ranch:info(Id),
|
||||||
|
Conns = proplists:get_value(all_connections, Info, 0),
|
||||||
|
Running =
|
||||||
|
case proplists:get_value(status, Info) of
|
||||||
|
running -> true;
|
||||||
|
_ -> false
|
||||||
|
end,
|
||||||
|
{Running, Conns};
|
||||||
|
current_listener_status(_Type, Id, ListenOn) ->
|
||||||
|
try esockd:get_current_connections({Id, ListenOn}) of
|
||||||
|
Int -> {true, Int}
|
||||||
|
catch
|
||||||
|
%% not started
|
||||||
|
error:not_found ->
|
||||||
|
{false, 0}
|
||||||
|
end.
|
||||||
|
|
||||||
ensure_integer_or_infinity(infinity) ->
|
ensure_integer_or_infinity(infinity) ->
|
||||||
infinity;
|
infinity;
|
||||||
ensure_integer_or_infinity(<<"infinity">>) ->
|
ensure_integer_or_infinity(<<"infinity">>) ->
|
||||||
|
|
|
@ -181,8 +181,55 @@ t_adjust_keepalive_timer(_Config) ->
|
||||||
?assertMatch(
|
?assertMatch(
|
||||||
#{conninfo := #{keepalive := 300}}, emqx_gateway_cm:get_chan_info(ocpp, <<"client1">>)
|
#{conninfo := #{keepalive := 300}}, emqx_gateway_cm:get_chan_info(ocpp, <<"client1">>)
|
||||||
),
|
),
|
||||||
|
%% close conns
|
||||||
|
close(ClientPid),
|
||||||
|
timer:sleep(1000),
|
||||||
|
%% assert:
|
||||||
|
?assertEqual(undefined, emqx_gateway_cm:get_chan_info(ocpp, <<"client1">>)),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
t_listeners_status(_Config) ->
|
||||||
|
{200, [Listener]} = request(get, "/gateways/ocpp/listeners"),
|
||||||
|
?assertMatch(
|
||||||
|
#{
|
||||||
|
status := #{running := true, current_connections := 0}
|
||||||
|
},
|
||||||
|
Listener
|
||||||
|
),
|
||||||
|
%% add a connection
|
||||||
|
{ok, ClientPid} = connect("127.0.0.1", 33033, <<"client1">>),
|
||||||
|
UniqueId = <<"3335862321">>,
|
||||||
|
BootNotification = #{
|
||||||
|
id => UniqueId,
|
||||||
|
type => ?OCPP_MSG_TYPE_ID_CALL,
|
||||||
|
action => <<"BootNotification">>,
|
||||||
|
payload => #{
|
||||||
|
<<"chargePointVendor">> => <<"vendor1">>,
|
||||||
|
<<"chargePointModel">> => <<"model1">>
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ok = send_msg(ClientPid, BootNotification),
|
||||||
|
timer:sleep(1000),
|
||||||
|
%% assert: the current_connections is 1
|
||||||
|
{200, [Listener1]} = request(get, "/gateways/ocpp/listeners"),
|
||||||
|
?assertMatch(
|
||||||
|
#{
|
||||||
|
status := #{running := true, current_connections := 1}
|
||||||
|
},
|
||||||
|
Listener1
|
||||||
|
),
|
||||||
|
%% close conns
|
||||||
|
close(ClientPid),
|
||||||
|
timer:sleep(1000),
|
||||||
|
%% assert: the current_connections is 0
|
||||||
|
{200, [Listener2]} = request(get, "/gateways/ocpp/listeners"),
|
||||||
|
?assertMatch(
|
||||||
|
#{
|
||||||
|
status := #{running := true, current_connections := 0}
|
||||||
|
},
|
||||||
|
Listener2
|
||||||
|
).
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% ocpp simple client
|
%% ocpp simple client
|
||||||
|
|
||||||
|
@ -229,3 +276,6 @@ receive_msg(ConnPid) ->
|
||||||
after 5000 ->
|
after 5000 ->
|
||||||
{error, timeout}
|
{error, timeout}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
close(ConnPid) ->
|
||||||
|
gun:shutdown(ConnPid).
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Avoid printing error logs when processing downstream messages
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Fix a logical error in OCPP gateway's handling of downstream BootNotification.
|
||||||
|
|
||||||
|
Fix the `gateways/ocpp/listeners` endpoint to return the correct current connection number.
|
Loading…
Reference in New Issue