From a4f855108c4540db7bea92a9c6c6ae7a80b7d53a Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Tue, 18 Jun 2024 15:17:25 +0200 Subject: [PATCH 1/4] fix: do not crash when showing rule unsing the cmd interface Before the change the command line command $ bin/emqx ctl rules show rule_0hyd would crash if the rule had bridge actions. This has now been fixed by adding a handler for printing bridge actions. Fixes: https://emqx.atlassian.net/browse/EMQX-12548 --- .../src/emqx_rule_engine_cli.erl | 6 +++++ .../test/emqx_rule_engine_SUITE.erl | 26 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl index cda4dc219..7e235b4ee 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl @@ -95,6 +95,12 @@ format_action(BridgeChannelId) when is_binary(BridgeChannelId) -> io_lib:format("- Name: ~s\n" " Type: data-bridge\n" ,[BridgeChannelId] + ); +format_action({bridge_v2, ActionType, ActionName}) -> + io_lib:format("- Name: ~p\n" + " Action Type: ~p\n" + " Type: data-bridge\n" + ,[ActionName, ActionType] ). left_pad(Str) -> diff --git a/apps/emqx_rule_engine/test/emqx_rule_engine_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_engine_SUITE.erl index 395883e7b..680aac759 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_engine_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_engine_SUITE.erl @@ -44,7 +44,8 @@ all() -> {group, metrics_simple}, {group, metrics_fail}, {group, metrics_fail_simple}, - {group, tracing} + {group, tracing}, + {group, command_line} ]. suite() -> @@ -147,6 +148,9 @@ groups() -> ]}, {tracing, [], [ t_trace_rule_id + ]}, + {command_line, [], [ + t_command_line_list_print_rule ]} ]. @@ -596,6 +600,26 @@ t_get_rule_ids_by_action(_) -> ?assertEqual([], emqx_rule_engine:get_rule_ids_by_action(<<"mysql:not_exists">>)), ok = delete_rules_by_ids([<<"t_get_rule_ids_by_action">>]). +%% Check that command line interface don't crash when listing and showing rules +t_command_line_list_print_rule(_) -> + ID = <<"t_command_line">>, + Rule1 = #{ + id => ID, + sql => <<"SELECT * FROM \"t\"">>, + actions => [ + #{function => console, args => #{}}, + #{function => republish, args => #{}}, + <<"mqtt:my_mqtt_bridge">>, + <<"mysql:foo">> + ], + description => ID, + created_at => erlang:system_time(millisecond) + }, + ok = create_rules([Rule1]), + ok = emqx_rule_engine_cli:cmd(["list"]), + ok = emqx_rule_engine_cli:cmd(["show", binary_to_list(ID)]), + ok = delete_rules_by_ids([ID]). + t_ensure_action_removed(_) -> Id = <<"t_ensure_action_removed">>, GetSelectedData = <<"emqx_rule_sqltester:get_selected_data">>, From 3c8c8ddf36ecbeb658054550e5d1bdf8472bd938 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Tue, 18 Jun 2024 15:42:06 +0200 Subject: [PATCH 2/4] docs: add change log entry --- changes/ce/fix-13290.en.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changes/ce/fix-13290.en.md diff --git a/changes/ce/fix-13290.en.md b/changes/ce/fix-13290.en.md new file mode 100644 index 000000000..cbc47c9de --- /dev/null +++ b/changes/ce/fix-13290.en.md @@ -0,0 +1,3 @@ +The following command previously printed nothing if the rule had a data bridge action attached to it. This is now fixed. + + $ bin/emqx ctl rules show rule_0hyd From 4a318f8f5185221d9bb3bf8ad9cae9dc180c006d Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Tue, 18 Jun 2024 17:02:26 +0200 Subject: [PATCH 3/4] style: fix type problem found by dialyzer --- apps/emqx_bridge/src/emqx_bridge_v2.erl | 2 +- apps/emqx_rule_engine/include/rule_engine.hrl | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/emqx_bridge/src/emqx_bridge_v2.erl b/apps/emqx_bridge/src/emqx_bridge_v2.erl index 0b2e9277a..f9c161e0f 100644 --- a/apps/emqx_bridge/src/emqx_bridge_v2.erl +++ b/apps/emqx_bridge/src/emqx_bridge_v2.erl @@ -164,7 +164,7 @@ -type root_cfg_key() :: ?ROOT_KEY_ACTIONS | ?ROOT_KEY_SOURCES. --export_type([root_cfg_key/0]). +-export_type([root_cfg_key/0, bridge_v2_type/0, bridge_v2_name/0]). %%==================================================================== diff --git a/apps/emqx_rule_engine/include/rule_engine.hrl b/apps/emqx_rule_engine/include/rule_engine.hrl index 51165e18f..ec64bc596 100644 --- a/apps/emqx_rule_engine/include/rule_engine.hrl +++ b/apps/emqx_rule_engine/include/rule_engine.hrl @@ -42,7 +42,8 @@ func := builtin_action_func() | atom(), args => action_fun_args() } - | bridge_channel_id(). + | bridge_channel_id() + | {bridge_v2, emqx_bridge_v2:bridge_v2_type(), emqx_bridge_v2:bridge_v2_name()}. -type rule() :: #{ From 12859b8959f175d965de38210a6c7aa2f6a36183 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Thu, 20 Jun 2024 10:03:49 +0200 Subject: [PATCH 4/4] fix: handle yet another action format --- apps/emqx_rule_engine/include/rule_engine.hrl | 3 ++- apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/emqx_rule_engine/include/rule_engine.hrl b/apps/emqx_rule_engine/include/rule_engine.hrl index ec64bc596..7d0000a1c 100644 --- a/apps/emqx_rule_engine/include/rule_engine.hrl +++ b/apps/emqx_rule_engine/include/rule_engine.hrl @@ -43,7 +43,8 @@ args => action_fun_args() } | bridge_channel_id() - | {bridge_v2, emqx_bridge_v2:bridge_v2_type(), emqx_bridge_v2:bridge_v2_name()}. + | {bridge_v2, emqx_bridge_v2:bridge_v2_type(), emqx_bridge_v2:bridge_v2_name()} + | {bridge, emqx_utils_maps:config_key(), emqx_utils_maps:config_key(), bridge_channel_id()}. -type rule() :: #{ diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl index 7e235b4ee..da7ec420e 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine_cli.erl @@ -96,6 +96,12 @@ format_action(BridgeChannelId) when is_binary(BridgeChannelId) -> " Type: data-bridge\n" ,[BridgeChannelId] ); +format_action({bridge, ActionType, ActionName, _Id}) -> + io_lib:format("- Name: ~p\n" + " Action Type: ~p\n" + " Type: data-bridge\n" + ,[ActionName, ActionType] + ); format_action({bridge_v2, ActionType, ActionName}) -> io_lib:format("- Name: ~p\n" " Action Type: ~p\n"