From 18f3920a73e6b2e87d69878d61dae39b301a1ee8 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Thu, 23 Jun 2022 21:59:11 +0200 Subject: [PATCH] feat: add --json option to 'emqx ctl cluster status' command --- apps/emqx_management/src/emqx_mgmt_cli.erl | 23 +++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/apps/emqx_management/src/emqx_mgmt_cli.erl b/apps/emqx_management/src/emqx_mgmt_cli.erl index 50f4b21af..0f60317fa 100644 --- a/apps/emqx_management/src/emqx_mgmt_cli.erl +++ b/apps/emqx_management/src/emqx_mgmt_cli.erl @@ -135,14 +135,35 @@ cluster(["force-leave", SNode]) -> end; cluster(["status"]) -> emqx_ctl:print("Cluster status: ~p~n", [ekka_cluster:info()]); +cluster(["status", "--json"]) -> + Info = sort_map_list_fields(ekka_cluster:info()), + emqx_ctl:print("~ts~n", [emqx_logger_jsonfmt:best_effort_json(Info)]); cluster(_) -> emqx_ctl:usage([ {"cluster join ", "Join the cluster"}, {"cluster leave", "Leave the cluster"}, {"cluster force-leave ", "Force the node leave from cluster"}, - {"cluster status", "Cluster status"} + {"cluster status [--json]", "Cluster status"} ]). +%% sort lists for deterministic output +sort_map_list_fields(Map) when is_map(Map) -> + lists:foldl( + fun(Field, Acc) -> + sort_map_list_field(Field, Acc) + end, + Map, + maps:keys(Map) + ); +sort_map_list_fields(NotMap) -> + NotMap. + +sort_map_list_field(Field, Map) -> + case maps:get(Field, Map) of + [_ | _] = L -> Map#{Field := lists:sort(L)}; + _ -> Map + end. + %%-------------------------------------------------------------------- %% @doc Query clients