Merge pull request #13506 from thalesmg/20240722-m-peername-sys-events

feat: add `peername` to rule events that already have `peerhost`
This commit is contained in:
Thales Macedo Garitezi 2024-07-23 09:38:57 -03:00 committed by GitHub
commit 9c0f1df8a3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 169 additions and 21 deletions

View File

@ -235,7 +235,7 @@ caps(#channel{clientinfo = #{zone := Zone}}) ->
-spec init(emqx_types:conninfo(), opts()) -> channel(). -spec init(emqx_types:conninfo(), opts()) -> channel().
init( init(
ConnInfo = #{ ConnInfo = #{
peername := {PeerHost, PeerPort}, peername := {PeerHost, PeerPort} = PeerName,
sockname := {_Host, SockPort} sockname := {_Host, SockPort}
}, },
#{ #{
@ -259,6 +259,9 @@ init(
listener => ListenerId, listener => ListenerId,
protocol => Protocol, protocol => Protocol,
peerhost => PeerHost, peerhost => PeerHost,
%% We copy peername to clientinfo because some event contexts only have access
%% to client info (e.g.: authn/authz).
peername => PeerName,
peerport => PeerPort, peerport => PeerPort,
sockport => SockPort, sockport => SockPort,
clientid => undefined, clientid => undefined,

View File

@ -308,6 +308,7 @@ clientinfo(OldClientInfo) ->
zone, zone,
protocol, protocol,
peerhost, peerhost,
peername,
sockport, sockport,
clientid, clientid,
username, username,

View File

@ -120,7 +120,7 @@ stats(#channel{session = Session}) ->
-spec init(map(), map()) -> channel(). -spec init(map(), map()) -> channel().
init( init(
ConnInfo = #{ ConnInfo = #{
peername := {PeerHost, _}, peername := {PeerHost, _} = PeerName,
sockname := {_, SockPort} sockname := {_, SockPort}
}, },
#{ctx := Ctx} = Config #{ctx := Ctx} = Config
@ -140,6 +140,7 @@ init(
listener => ListenerId, listener => ListenerId,
protocol => 'coap', protocol => 'coap',
peerhost => PeerHost, peerhost => PeerHost,
peername => PeerName,
sockport => SockPort, sockport => SockPort,
clientid => emqx_guid:to_base62(emqx_guid:gen()), clientid => emqx_guid:to_base62(emqx_guid:gen()),
username => undefined, username => undefined,

View File

@ -802,7 +802,7 @@ default_conninfo(ConnInfo) ->
}. }.
default_clientinfo(#{ default_clientinfo(#{
peername := {PeerHost, _}, peername := {PeerHost, _} = PeerName,
sockname := {_, SockPort}, sockname := {_, SockPort},
clientid := ClientId clientid := ClientId
}) -> }) ->
@ -810,6 +810,7 @@ default_clientinfo(#{
zone => default, zone => default,
protocol => exproto, protocol => exproto,
peerhost => PeerHost, peerhost => PeerHost,
peername => PeerName,
sockport => SockPort, sockport => SockPort,
clientid => ClientId, clientid => ClientId,
username => undefined, username => undefined,

View File

@ -138,7 +138,7 @@ set_conn_state(ConnState, Channel) ->
init( init(
ConnInfo = #{ ConnInfo = #{
peername := {PeerHost, _Port}, peername := {PeerHost, _Port} = PeerName,
sockname := {_Host, SockPort} sockname := {_Host, SockPort}
}, },
Options Options
@ -160,6 +160,7 @@ init(
listener => ListenerId, listener => ListenerId,
protocol => gbt32960, protocol => gbt32960,
peerhost => PeerHost, peerhost => PeerHost,
peername => PeerName,
sockport => SockPort, sockport => SockPort,
clientid => undefined, clientid => undefined,
username => undefined, username => undefined,

View File

@ -147,7 +147,7 @@ stats(#channel{inflight = Inflight, mqueue = Queue}) ->
-spec init(emqx_types:conninfo(), map()) -> channel(). -spec init(emqx_types:conninfo(), map()) -> channel().
init( init(
ConnInfo = #{ ConnInfo = #{
peername := {PeerHost, _Port}, peername := {PeerHost, _Port} = PeerName,
sockname := {_Host, SockPort} sockname := {_Host, SockPort}
}, },
Options = #{ Options = #{
@ -171,6 +171,7 @@ init(
listener => ListenerId, listener => ListenerId,
protocol => jt808, protocol => jt808,
peerhost => PeerHost, peerhost => PeerHost,
peername => PeerName,
sockport => SockPort, sockport => SockPort,
clientid => undefined, clientid => undefined,
username => undefined, username => undefined,

View File

@ -1,7 +1,7 @@
%% -*- mode: erlang -*- %% -*- mode: erlang -*-
{application, emqx_gateway_lwm2m, [ {application, emqx_gateway_lwm2m, [
{description, "LwM2M Gateway"}, {description, "LwM2M Gateway"},
{vsn, "0.1.6"}, {vsn, "0.1.7"},
{registered, []}, {registered, []},
{applications, [kernel, stdlib, emqx, emqx_gateway, emqx_gateway_coap, xmerl]}, {applications, [kernel, stdlib, emqx, emqx_gateway, emqx_gateway_coap, xmerl]},
{env, []}, {env, []},

View File

@ -119,7 +119,7 @@ stats(#channel{session = Session}) ->
init( init(
ConnInfo = #{ ConnInfo = #{
peername := {PeerHost, _}, peername := {PeerHost, _} = PeerName,
sockname := {_, SockPort} sockname := {_, SockPort}
}, },
#{ctx := Ctx} = Config #{ctx := Ctx} = Config
@ -139,6 +139,7 @@ init(
listener => ListenerId, listener => ListenerId,
protocol => lwm2m, protocol => lwm2m,
peerhost => PeerHost, peerhost => PeerHost,
peername => PeerName,
sockport => SockPort, sockport => SockPort,
username => undefined, username => undefined,
clientid => undefined, clientid => undefined,

View File

@ -130,7 +130,7 @@
%% @doc Init protocol %% @doc Init protocol
init( init(
ConnInfo = #{ ConnInfo = #{
peername := {PeerHost, _}, peername := {PeerHost, _} = PeerName,
sockname := {_, SockPort} sockname := {_, SockPort}
}, },
Option Option
@ -152,6 +152,7 @@ init(
listener => ListenerId, listener => ListenerId,
protocol => 'mqtt-sn', protocol => 'mqtt-sn',
peerhost => PeerHost, peerhost => PeerHost,
peername => PeerName,
sockport => SockPort, sockport => SockPort,
clientid => undefined, clientid => undefined,
username => undefined, username => undefined,

View File

@ -209,7 +209,7 @@ stats(#channel{mqueue = MQueue}) ->
-spec init(emqx_types:conninfo(), map()) -> channel(). -spec init(emqx_types:conninfo(), map()) -> channel().
init( init(
ConnInfo = #{ ConnInfo = #{
peername := {PeerHost, _Port}, peername := {PeerHost, _Port} = PeerName,
sockname := {_Host, SockPort} sockname := {_Host, SockPort}
}, },
Options Options
@ -230,6 +230,7 @@ init(
listener => ListenerId, listener => ListenerId,
protocol => ocpp, protocol => ocpp,
peerhost => PeerHost, peerhost => PeerHost,
peername => PeerName,
sockport => SockPort, sockport => SockPort,
clientid => undefined, clientid => undefined,
username => undefined, username => undefined,
@ -325,9 +326,9 @@ enrich_client(
set_log_meta(#channel{ set_log_meta(#channel{
clientinfo = #{clientid := ClientId}, clientinfo = #{clientid := ClientId},
conninfo = #{peername := Peername} conninfo = #{peername := PeerName}
}) -> }) ->
emqx_logger:set_metadata_peername(esockd:format(Peername)), emqx_logger:set_metadata_peername(esockd:format(PeerName)),
emqx_logger:set_metadata_clientid(ClientId). emqx_logger:set_metadata_clientid(ClientId).
run_conn_hooks(_UserInfo, Channel = #channel{conninfo = ConnInfo}) -> run_conn_hooks(_UserInfo, Channel = #channel{conninfo = ConnInfo}) ->

View File

@ -117,7 +117,7 @@
%% @doc Init protocol %% @doc Init protocol
init( init(
ConnInfo = #{ ConnInfo = #{
peername := {PeerHost, _}, peername := {PeerHost, _} = PeerName,
sockname := {_, SockPort} sockname := {_, SockPort}
}, },
Option Option
@ -137,6 +137,7 @@ init(
listener => ListenerId, listener => ListenerId,
protocol => stomp, protocol => stomp,
peerhost => PeerHost, peerhost => PeerHost,
peername => PeerName,
sockport => SockPort, sockport => SockPort,
clientid => undefined, clientid => undefined,
username => undefined, username => undefined,

View File

@ -329,6 +329,7 @@ eventmsg_publish(
username => emqx_message:get_header(username, Message, undefined), username => emqx_message:get_header(username, Message, undefined),
payload => Payload, payload => Payload,
peerhost => ntoa(emqx_message:get_header(peerhost, Message, undefined)), peerhost => ntoa(emqx_message:get_header(peerhost, Message, undefined)),
peername => ntoa(emqx_message:get_header(peername, Message, undefined)),
topic => Topic, topic => Topic,
qos => QoS, qos => QoS,
flags => Flags, flags => Flags,
@ -446,7 +447,8 @@ eventmsg_check_authz_complete(
_ClientInfo = #{ _ClientInfo = #{
clientid := ClientId, clientid := ClientId,
username := Username, username := Username,
peerhost := PeerHost peerhost := PeerHost,
peername := PeerName
}, },
PubSub, PubSub,
Topic, Topic,
@ -458,6 +460,7 @@ eventmsg_check_authz_complete(
#{ #{
clientid => ClientId, clientid => ClientId,
username => Username, username => Username,
peername => ntoa(PeerName),
peerhost => ntoa(PeerHost), peerhost => ntoa(PeerHost),
topic => Topic, topic => Topic,
action => PubSub, action => PubSub,
@ -471,8 +474,7 @@ eventmsg_check_authn_complete(
_ClientInfo = #{ _ClientInfo = #{
clientid := ClientId, clientid := ClientId,
username := Username, username := Username,
peerhost := PeerHost, peername := PeerName
peerport := PeerPort
}, },
Result Result
) -> ) ->
@ -488,7 +490,7 @@ eventmsg_check_authn_complete(
#{ #{
clientid => ClientId, clientid => ClientId,
username => Username, username => Username,
peername => ntoa({PeerHost, PeerPort}), peername => ntoa(PeerName),
reason_code => force_to_bin(Reason), reason_code => force_to_bin(Reason),
is_anonymous => IsAnonymous, is_anonymous => IsAnonymous,
is_superuser => IsSuperuser is_superuser => IsSuperuser
@ -501,7 +503,8 @@ eventmsg_sub_or_unsub(
_ClientInfo = #{ _ClientInfo = #{
clientid := ClientId, clientid := ClientId,
username := Username, username := Username,
peerhost := PeerHost peerhost := PeerHost,
peername := PeerName
}, },
Topic, Topic,
SubOpts = #{qos := QoS} SubOpts = #{qos := QoS}
@ -513,6 +516,7 @@ eventmsg_sub_or_unsub(
clientid => ClientId, clientid => ClientId,
username => Username, username => Username,
peerhost => ntoa(PeerHost), peerhost => ntoa(PeerHost),
peername => ntoa(PeerName),
PropKey => printable_maps(maps:get(PropKey, SubOpts, #{})), PropKey => printable_maps(maps:get(PropKey, SubOpts, #{})),
topic => Topic, topic => Topic,
qos => QoS qos => QoS
@ -542,6 +546,7 @@ eventmsg_dropped(
username => emqx_message:get_header(username, Message, undefined), username => emqx_message:get_header(username, Message, undefined),
payload => Payload, payload => Payload,
peerhost => ntoa(emqx_message:get_header(peerhost, Message, undefined)), peerhost => ntoa(emqx_message:get_header(peerhost, Message, undefined)),
peername => ntoa(emqx_message:get_header(peername, Message, undefined)),
topic => Topic, topic => Topic,
qos => QoS, qos => QoS,
flags => Flags, flags => Flags,
@ -606,6 +611,7 @@ eventmsg_validation_failed(
username => emqx_message:get_header(username, Message, undefined), username => emqx_message:get_header(username, Message, undefined),
payload => Payload, payload => Payload,
peerhost => ntoa(emqx_message:get_header(peerhost, Message, undefined)), peerhost => ntoa(emqx_message:get_header(peerhost, Message, undefined)),
peername => ntoa(emqx_message:get_header(peername, Message, undefined)),
topic => Topic, topic => Topic,
qos => QoS, qos => QoS,
flags => Flags, flags => Flags,
@ -618,6 +624,7 @@ eventmsg_validation_failed(
eventmsg_delivered( eventmsg_delivered(
_ClientInfo = #{ _ClientInfo = #{
peerhost := PeerHost, peerhost := PeerHost,
peername := PeerName,
clientid := ReceiverCId, clientid := ReceiverCId,
username := ReceiverUsername username := ReceiverUsername
}, },
@ -642,6 +649,7 @@ eventmsg_delivered(
username => ReceiverUsername, username => ReceiverUsername,
payload => Payload, payload => Payload,
peerhost => ntoa(PeerHost), peerhost => ntoa(PeerHost),
peername => ntoa(PeerName),
topic => Topic, topic => Topic,
qos => QoS, qos => QoS,
flags => Flags, flags => Flags,
@ -654,6 +662,7 @@ eventmsg_delivered(
eventmsg_acked( eventmsg_acked(
_ClientInfo = #{ _ClientInfo = #{
peerhost := PeerHost, peerhost := PeerHost,
peername := PeerName,
clientid := ReceiverCId, clientid := ReceiverCId,
username := ReceiverUsername username := ReceiverUsername
}, },
@ -678,6 +687,7 @@ eventmsg_acked(
username => ReceiverUsername, username => ReceiverUsername,
payload => Payload, payload => Payload,
peerhost => ntoa(PeerHost), peerhost => ntoa(PeerHost),
peername => ntoa(PeerName),
topic => Topic, topic => Topic,
qos => QoS, qos => QoS,
flags => Flags, flags => Flags,
@ -691,6 +701,7 @@ eventmsg_acked(
eventmsg_delivery_dropped( eventmsg_delivery_dropped(
_ClientInfo = #{ _ClientInfo = #{
peerhost := PeerHost, peerhost := PeerHost,
peername := PeerName,
clientid := ReceiverCId, clientid := ReceiverCId,
username := ReceiverUsername username := ReceiverUsername
}, },
@ -717,6 +728,7 @@ eventmsg_delivery_dropped(
username => ReceiverUsername, username => ReceiverUsername,
payload => Payload, payload => Payload,
peerhost => ntoa(PeerHost), peerhost => ntoa(PeerHost),
peername => ntoa(PeerName),
topic => Topic, topic => Topic,
qos => QoS, qos => QoS,
flags => Flags, flags => Flags,
@ -1009,6 +1021,7 @@ columns_with_exam('message.publish') ->
{<<"username">>, <<"u_emqx">>}, {<<"username">>, <<"u_emqx">>},
{<<"payload">>, <<"{\"msg\": \"hello\"}">>}, {<<"payload">>, <<"{\"msg\": \"hello\"}">>},
{<<"peerhost">>, <<"192.168.0.10">>}, {<<"peerhost">>, <<"192.168.0.10">>},
{<<"peername">>, <<"192.168.0.10:32781">>},
{<<"topic">>, <<"t/a">>}, {<<"topic">>, <<"t/a">>},
{<<"qos">>, 1}, {<<"qos">>, 1},
{<<"flags">>, #{}}, {<<"flags">>, #{}},
@ -1031,6 +1044,7 @@ columns_with_exam('message.dropped') ->
{<<"username">>, <<"u_emqx">>}, {<<"username">>, <<"u_emqx">>},
{<<"payload">>, <<"{\"msg\": \"hello\"}">>}, {<<"payload">>, <<"{\"msg\": \"hello\"}">>},
{<<"peerhost">>, <<"192.168.0.10">>}, {<<"peerhost">>, <<"192.168.0.10">>},
{<<"peername">>, <<"192.168.0.10:32781">>},
{<<"topic">>, <<"t/a">>}, {<<"topic">>, <<"t/a">>},
{<<"qos">>, 1}, {<<"qos">>, 1},
{<<"flags">>, #{}}, {<<"flags">>, #{}},
@ -1048,6 +1062,7 @@ columns_with_exam('schema.validation_failed') ->
{<<"username">>, <<"u_emqx">>}, {<<"username">>, <<"u_emqx">>},
{<<"payload">>, <<"{\"msg\": \"hello\"}">>}, {<<"payload">>, <<"{\"msg\": \"hello\"}">>},
{<<"peerhost">>, <<"192.168.0.10">>}, {<<"peerhost">>, <<"192.168.0.10">>},
{<<"peername">>, <<"192.168.0.10:32781">>},
{<<"topic">>, <<"t/a">>}, {<<"topic">>, <<"t/a">>},
{<<"qos">>, 1}, {<<"qos">>, 1},
{<<"flags">>, #{}}, {<<"flags">>, #{}},
@ -1084,6 +1099,7 @@ columns_with_exam('delivery.dropped') ->
{<<"username">>, <<"u_emqx_2">>}, {<<"username">>, <<"u_emqx_2">>},
{<<"payload">>, <<"{\"msg\": \"hello\"}">>}, {<<"payload">>, <<"{\"msg\": \"hello\"}">>},
{<<"peerhost">>, <<"192.168.0.10">>}, {<<"peerhost">>, <<"192.168.0.10">>},
{<<"peername">>, <<"192.168.0.10:32781">>},
{<<"topic">>, <<"t/a">>}, {<<"topic">>, <<"t/a">>},
{<<"qos">>, 1}, {<<"qos">>, 1},
{<<"flags">>, #{}}, {<<"flags">>, #{}},
@ -1150,6 +1166,7 @@ columns_with_exam('client.check_authz_complete') ->
{<<"clientid">>, <<"c_emqx">>}, {<<"clientid">>, <<"c_emqx">>},
{<<"username">>, <<"u_emqx">>}, {<<"username">>, <<"u_emqx">>},
{<<"peerhost">>, <<"192.168.0.10">>}, {<<"peerhost">>, <<"192.168.0.10">>},
{<<"peername">>, <<"192.168.0.10:32781">>},
{<<"topic">>, <<"t/a">>}, {<<"topic">>, <<"t/a">>},
{<<"action">>, <<"publish">>}, {<<"action">>, <<"publish">>},
{<<"authz_source">>, <<"cache">>}, {<<"authz_source">>, <<"cache">>},
@ -1197,6 +1214,7 @@ columns_message_sub_unsub(EventName) ->
{<<"clientid">>, <<"c_emqx">>}, {<<"clientid">>, <<"c_emqx">>},
{<<"username">>, <<"u_emqx">>}, {<<"username">>, <<"u_emqx">>},
{<<"peerhost">>, <<"192.168.0.10">>}, {<<"peerhost">>, <<"192.168.0.10">>},
{<<"peername">>, <<"192.168.0.10:32781">>},
{<<"topic">>, <<"t/a">>}, {<<"topic">>, <<"t/a">>},
{<<"qos">>, 1}, {<<"qos">>, 1},
{<<"timestamp">>, erlang:system_time(millisecond)}, {<<"timestamp">>, erlang:system_time(millisecond)},
@ -1213,6 +1231,7 @@ columns_message_ack_delivered(EventName) ->
{<<"username">>, <<"u_emqx_2">>}, {<<"username">>, <<"u_emqx_2">>},
{<<"payload">>, <<"{\"msg\": \"hello\"}">>}, {<<"payload">>, <<"{\"msg\": \"hello\"}">>},
{<<"peerhost">>, <<"192.168.0.10">>}, {<<"peerhost">>, <<"192.168.0.10">>},
{<<"peername">>, <<"192.168.0.10:32781">>},
{<<"topic">>, <<"t/a">>}, {<<"topic">>, <<"t/a">>},
{<<"qos">>, 1}, {<<"qos">>, 1},
{<<"flags">>, #{}}, {<<"flags">>, #{}},

View File

@ -160,13 +160,55 @@ groups() ->
init_per_suite(Config) -> init_per_suite(Config) ->
Apps = emqx_cth_suite:start( Apps = emqx_cth_suite:start(
[ lists:flatten([
emqx, emqx,
emqx_conf, emqx_conf,
emqx_rule_engine, emqx_rule_engine,
emqx_auth, emqx_auth,
emqx_bridge emqx_bridge,
], [
{emqx_schema_validation, #{
config => #{
<<"schema_validation">> => #{
<<"validations">> => [
#{
<<"name">> => <<"v1">>,
<<"topics">> => [<<"sv/fail">>],
<<"strategy">> => <<"all_pass">>,
<<"failure_action">> => <<"drop">>,
<<"checks">> => [
#{
<<"type">> => <<"sql">>,
<<"sql">> => <<"select 1 where false">>
}
]
}
]
}
}
}}
|| is_ee()
],
[
{emqx_message_transformation, #{
config => #{
<<"message_transformation">> => #{
<<"transformations">> => [
#{
<<"name">> => <<"t1">>,
<<"topics">> => <<"mt/fail">>,
<<"failure_action">> => <<"drop">>,
<<"payload_decoder">> => #{<<"type">> => <<"json">>},
<<"payload_encoder">> => #{<<"type">> => <<"json">>},
<<"operations">> => []
}
]
}
}
}}
|| is_ee()
]
]),
#{work_dir => emqx_cth_suite:work_dir(Config)} #{work_dir => emqx_cth_suite:work_dir(Config)}
), ),
[{apps, Apps} | Config]. [{apps, Apps} | Config].
@ -250,6 +292,8 @@ init_per_testcase(t_events, Config) ->
"\"$events/message_delivered\", " "\"$events/message_delivered\", "
"\"$events/message_dropped\", " "\"$events/message_dropped\", "
"\"$events/delivery_dropped\", " "\"$events/delivery_dropped\", "
"\"$events/schema_validation_failed\", "
"\"$events/message_transformation_failed\", "
"\"t1\"", "\"t1\"",
{ok, Rule} = emqx_rule_engine:create_rule( {ok, Rule} = emqx_rule_engine:create_rule(
#{ #{
@ -834,6 +878,13 @@ t_events(_Config) ->
session_subscribed(Client2), session_subscribed(Client2),
ct:pal("====== verify t1"), ct:pal("====== verify t1"),
message_publish(Client), message_publish(Client),
is_ee() andalso
begin
ct:pal("====== verify $events/schema_validation_failed"),
schema_validation_failed(Client),
ct:pal("====== verify $events/message_transformation_failed"),
message_transformation_failed(Client)
end,
ct:pal("====== verify $events/delivery_dropped"), ct:pal("====== verify $events/delivery_dropped"),
delivery_dropped(Client), delivery_dropped(Client),
ct:pal("====== verify $events/message_delivered"), ct:pal("====== verify $events/message_delivered"),
@ -1151,6 +1202,16 @@ message_dropped(Client) ->
message_acked(_Client) -> message_acked(_Client) ->
verify_event('message.acked'), verify_event('message.acked'),
ok. ok.
schema_validation_failed(Client) ->
{ok, _} = emqtt:publish(Client, <<"sv/fail">>, <<"">>, [{qos, 1}]),
ct:sleep(100),
verify_event('schema.validation_failed'),
ok.
message_transformation_failed(Client) ->
{ok, _} = emqtt:publish(Client, <<"mt/fail">>, <<"will fail to { parse">>, [{qos, 1}]),
ct:sleep(100),
verify_event('message.transformation_failed'),
ok.
t_match_atom_and_binary(_Config) -> t_match_atom_and_binary(_Config) ->
SQL = SQL =
@ -3834,6 +3895,9 @@ t_trace_rule_id(_Config) ->
%% Internal helpers %% Internal helpers
%%------------------------------------------------------------------------------ %%------------------------------------------------------------------------------
is_ee() ->
emqx_release:edition() == ee.
republish_action(Topic) -> republish_action(Topic) ->
republish_action(Topic, <<"${payload}">>). republish_action(Topic, <<"${payload}">>).
@ -3920,6 +3984,7 @@ verify_event_fields('message.publish', Fields) ->
username := Username, username := Username,
payload := Payload, payload := Payload,
peerhost := PeerHost, peerhost := PeerHost,
peername := PeerName,
topic := Topic, topic := Topic,
qos := QoS, qos := QoS,
flags := Flags, flags := Flags,
@ -3934,6 +3999,7 @@ verify_event_fields('message.publish', Fields) ->
?assertEqual(<<"c_event">>, ClientId), ?assertEqual(<<"c_event">>, ClientId),
?assertEqual(<<"u_event">>, Username), ?assertEqual(<<"u_event">>, Username),
?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload), ?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload),
verify_peername(PeerName),
verify_ipaddr(PeerHost), verify_ipaddr(PeerHost),
?assertEqual(<<"t1">>, Topic), ?assertEqual(<<"t1">>, Topic),
?assertEqual(1, QoS), ?assertEqual(1, QoS),
@ -4008,6 +4074,7 @@ verify_event_fields(SubUnsub, Fields) when
clientid := ClientId, clientid := ClientId,
username := Username, username := Username,
peerhost := PeerHost, peerhost := PeerHost,
peername := PeerName,
topic := Topic, topic := Topic,
qos := QoS, qos := QoS,
timestamp := Timestamp timestamp := Timestamp
@ -4017,6 +4084,7 @@ verify_event_fields(SubUnsub, Fields) when
?assert(is_atom(reason)), ?assert(is_atom(reason)),
?assertEqual(<<"c_event2">>, ClientId), ?assertEqual(<<"c_event2">>, ClientId),
?assertEqual(<<"u_event2">>, Username), ?assertEqual(<<"u_event2">>, Username),
verify_peername(PeerName),
verify_ipaddr(PeerHost), verify_ipaddr(PeerHost),
?assertEqual(<<"t1">>, Topic), ?assertEqual(<<"t1">>, Topic),
?assertEqual(1, QoS), ?assertEqual(1, QoS),
@ -4043,6 +4111,7 @@ verify_event_fields('delivery.dropped', Fields) ->
node := Node, node := Node,
payload := Payload, payload := Payload,
peerhost := PeerHost, peerhost := PeerHost,
peername := PeerName,
pub_props := Properties, pub_props := Properties,
publish_received_at := EventAt, publish_received_at := EventAt,
qos := QoS, qos := QoS,
@ -4062,6 +4131,7 @@ verify_event_fields('delivery.dropped', Fields) ->
?assertEqual(<<"c_event">>, FromClientId), ?assertEqual(<<"c_event">>, FromClientId),
?assertEqual(<<"u_event">>, FromUsername), ?assertEqual(<<"u_event">>, FromUsername),
?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload), ?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload),
verify_peername(PeerName),
verify_ipaddr(PeerHost), verify_ipaddr(PeerHost),
?assertEqual(<<"t1">>, Topic), ?assertEqual(<<"t1">>, Topic),
?assertEqual(1, QoS), ?assertEqual(1, QoS),
@ -4078,6 +4148,7 @@ verify_event_fields('message.dropped', Fields) ->
username := Username, username := Username,
payload := Payload, payload := Payload,
peerhost := PeerHost, peerhost := PeerHost,
peername := PeerName,
topic := Topic, topic := Topic,
qos := QoS, qos := QoS,
flags := Flags, flags := Flags,
@ -4093,6 +4164,7 @@ verify_event_fields('message.dropped', Fields) ->
?assertEqual(<<"c_event">>, ClientId), ?assertEqual(<<"c_event">>, ClientId),
?assertEqual(<<"u_event">>, Username), ?assertEqual(<<"u_event">>, Username),
?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload), ?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload),
verify_peername(PeerName),
verify_ipaddr(PeerHost), verify_ipaddr(PeerHost),
?assertEqual(<<"t1">>, Topic), ?assertEqual(<<"t1">>, Topic),
?assertEqual(1, QoS), ?assertEqual(1, QoS),
@ -4110,6 +4182,7 @@ verify_event_fields('message.delivered', Fields) ->
from_username := FromUsername, from_username := FromUsername,
payload := Payload, payload := Payload,
peerhost := PeerHost, peerhost := PeerHost,
peername := PeerName,
topic := Topic, topic := Topic,
qos := QoS, qos := QoS,
flags := Flags, flags := Flags,
@ -4126,6 +4199,7 @@ verify_event_fields('message.delivered', Fields) ->
?assertEqual(<<"c_event">>, FromClientId), ?assertEqual(<<"c_event">>, FromClientId),
?assertEqual(<<"u_event">>, FromUsername), ?assertEqual(<<"u_event">>, FromUsername),
?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload), ?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload),
verify_peername(PeerName),
verify_ipaddr(PeerHost), verify_ipaddr(PeerHost),
?assertEqual(<<"t1">>, Topic), ?assertEqual(<<"t1">>, Topic),
?assertEqual(1, QoS), ?assertEqual(1, QoS),
@ -4143,6 +4217,7 @@ verify_event_fields('message.acked', Fields) ->
from_username := FromUsername, from_username := FromUsername,
payload := Payload, payload := Payload,
peerhost := PeerHost, peerhost := PeerHost,
peername := PeerName,
topic := Topic, topic := Topic,
qos := QoS, qos := QoS,
flags := Flags, flags := Flags,
@ -4160,6 +4235,7 @@ verify_event_fields('message.acked', Fields) ->
?assertEqual(<<"c_event">>, FromClientId), ?assertEqual(<<"c_event">>, FromClientId),
?assertEqual(<<"u_event">>, FromUsername), ?assertEqual(<<"u_event">>, FromUsername),
?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload), ?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload),
verify_peername(PeerName),
verify_ipaddr(PeerHost), verify_ipaddr(PeerHost),
?assertEqual(<<"t1">>, Topic), ?assertEqual(<<"t1">>, Topic),
?assertEqual(1, QoS), ?assertEqual(1, QoS),
@ -4203,6 +4279,7 @@ verify_event_fields('client.check_authz_complete', Fields) ->
clientid := ClientId, clientid := ClientId,
action := Action, action := Action,
result := Result, result := Result,
peername := PeerName,
topic := Topic, topic := Topic,
authz_source := AuthzSource, authz_source := AuthzSource,
username := Username username := Username
@ -4210,6 +4287,7 @@ verify_event_fields('client.check_authz_complete', Fields) ->
?assertEqual(<<"t1">>, Topic), ?assertEqual(<<"t1">>, Topic),
?assert(lists:member(Action, [subscribe, publish])), ?assert(lists:member(Action, [subscribe, publish])),
?assert(lists:member(Result, [allow, deny])), ?assert(lists:member(Result, [allow, deny])),
verify_peername(PeerName),
?assert( ?assert(
lists:member(AuthzSource, [ lists:member(AuthzSource, [
cache, cache,
@ -4228,14 +4306,52 @@ verify_event_fields('client.check_authz_complete', Fields) ->
verify_event_fields('client.check_authn_complete', Fields) -> verify_event_fields('client.check_authn_complete', Fields) ->
#{ #{
clientid := ClientId, clientid := ClientId,
peername := PeerName,
username := Username, username := Username,
is_anonymous := IsAnonymous, is_anonymous := IsAnonymous,
is_superuser := IsSuperuser is_superuser := IsSuperuser
} = Fields, } = Fields,
verify_peername(PeerName),
?assert(lists:member(ClientId, [<<"c_event">>, <<"c_event2">>])), ?assert(lists:member(ClientId, [<<"c_event">>, <<"c_event2">>])),
?assert(lists:member(Username, [<<"u_event">>, <<"u_event2">>])), ?assert(lists:member(Username, [<<"u_event">>, <<"u_event2">>])),
?assert(erlang:is_boolean(IsAnonymous)), ?assert(erlang:is_boolean(IsAnonymous)),
?assert(erlang:is_boolean(IsSuperuser)). ?assert(erlang:is_boolean(IsSuperuser));
verify_event_fields('schema.validation_failed', Fields) ->
#{
validation := ValidationName,
clientid := ClientId,
username := Username,
payload := _Payload,
peername := PeerName,
qos := _QoS,
topic := _Topic,
flags := _Flags,
pub_props := _PubProps,
publish_received_at := _PublishReceivedAt
} = Fields,
?assertEqual(<<"v1">>, ValidationName),
verify_peername(PeerName),
?assert(lists:member(ClientId, [<<"c_event">>, <<"c_event2">>])),
?assert(lists:member(Username, [<<"u_event">>, <<"u_event2">>])),
ok;
verify_event_fields('message.transformation_failed', Fields) ->
#{
transformation := TransformationName,
clientid := ClientId,
username := Username,
payload := _Payload,
peername := PeerName,
qos := _QoS,
topic := _Topic,
flags := _Flags,
pub_props := _PubProps,
publish_received_at := _PublishReceivedAt
} = Fields,
?assertEqual(<<"t1">>, TransformationName),
verify_peername(PeerName),
?assert(lists:member(ClientId, [<<"c_event">>, <<"c_event2">>])),
?assert(lists:member(Username, [<<"u_event">>, <<"u_event2">>])),
ok.
verify_peername(PeerName) -> verify_peername(PeerName) ->
case string:split(PeerName, ":") of case string:split(PeerName, ":") of

View File

@ -0,0 +1 @@
Added the `peername` field to all rule engine events that already contained the `peerhost` field. `peername` is a string and has the `IP:PORT` format.