Merge pull request #12398 from lafirest/feat/api-docs

feat(dashboard): expose the `swagger_support` option
This commit is contained in:
lafirest 2024-01-31 23:31:56 +08:00 committed by GitHub
commit a60aeed539
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 60 additions and 7 deletions

View File

@ -76,7 +76,8 @@ start_listeners(Listeners) ->
security => [#{'basicAuth' => []}, #{'bearerAuth' => []}], security => [#{'basicAuth' => []}, #{'bearerAuth' => []}],
swagger_global_spec => GlobalSpec, swagger_global_spec => GlobalSpec,
dispatch => dispatch(), dispatch => dispatch(),
middlewares => [?EMQX_MIDDLE, cowboy_router, cowboy_handler] middlewares => [?EMQX_MIDDLE, cowboy_router, cowboy_handler],
swagger_support => emqx:get_config([dashboard, swagger_support], true)
}, },
{OkListeners, ErrListeners} = {OkListeners, ErrListeners} =
lists:foldl( lists:foldl(

View File

@ -149,12 +149,13 @@ remove_sensitive_data(Conf0) ->
post_config_update(_, {change_i18n_lang, _}, _NewConf, _OldConf, _AppEnvs) -> post_config_update(_, {change_i18n_lang, _}, _NewConf, _OldConf, _AppEnvs) ->
delay_job(regenerate); delay_job(regenerate);
post_config_update(_, _Req, NewConf, OldConf, _AppEnvs) -> post_config_update(_, _Req, NewConf, OldConf, _AppEnvs) ->
SwaggerSupport = diff_swagger_support(NewConf, OldConf),
OldHttp = get_listener(http, OldConf), OldHttp = get_listener(http, OldConf),
OldHttps = get_listener(https, OldConf), OldHttps = get_listener(https, OldConf),
NewHttp = get_listener(http, NewConf), NewHttp = get_listener(http, NewConf),
NewHttps = get_listener(https, NewConf), NewHttps = get_listener(https, NewConf),
{StopHttp, StartHttp} = diff_listeners(http, OldHttp, NewHttp), {StopHttp, StartHttp} = diff_listeners(http, OldHttp, NewHttp, SwaggerSupport),
{StopHttps, StartHttps} = diff_listeners(https, OldHttps, NewHttps), {StopHttps, StartHttps} = diff_listeners(https, OldHttps, NewHttps, SwaggerSupport),
Stop = maps:merge(StopHttp, StopHttps), Stop = maps:merge(StopHttp, StopHttps),
Start = maps:merge(StartHttp, StartHttps), Start = maps:merge(StartHttp, StartHttps),
delay_job({update_listeners, Stop, Start}). delay_job({update_listeners, Stop, Start}).
@ -168,10 +169,16 @@ delay_job(Msg) ->
get_listener(Type, Conf) -> get_listener(Type, Conf) ->
emqx_utils_maps:deep_get([listeners, Type], Conf, undefined). emqx_utils_maps:deep_get([listeners, Type], Conf, undefined).
diff_listeners(_, Listener, Listener) -> {#{}, #{}}; diff_swagger_support(NewConf, OldConf) ->
diff_listeners(Type, undefined, Start) -> {#{}, #{Type => Start}}; maps:get(swagger_support, NewConf, true) =:=
diff_listeners(Type, Stop, undefined) -> {#{Type => Stop}, #{}}; maps:get(swagger_support, OldConf, true).
diff_listeners(Type, Stop, Start) -> {#{Type => Stop}, #{Type => Start}}.
diff_listeners(_, undefined, undefined, _) -> {#{}, #{}};
diff_listeners(_, Listener, Listener, true) -> {#{}, #{}};
diff_listeners(Type, undefined, Start, _) -> {#{}, #{Type => Start}};
diff_listeners(Type, Stop, undefined, _) -> {#{Type => Stop}, #{}};
diff_listeners(Type, Listener, Listener, false) -> {#{Type => Listener}, #{Type => Listener}};
diff_listeners(Type, Stop, Start, _) -> {#{Type => Stop}, #{Type => Start}}.
-define(DIR, <<"dashboard">>). -define(DIR, <<"dashboard">>).

View File

@ -56,6 +56,7 @@ fields("dashboard") ->
} }
)}, )},
{cors, fun cors/1}, {cors, fun cors/1},
{swagger_support, fun swagger_support/1},
{i18n_lang, fun i18n_lang/1}, {i18n_lang, fun i18n_lang/1},
{bootstrap_users_file, {bootstrap_users_file,
?HOCON( ?HOCON(
@ -272,6 +273,11 @@ cors(required) -> false;
cors(desc) -> ?DESC(cors); cors(desc) -> ?DESC(cors);
cors(_) -> undefined. cors(_) -> undefined.
swagger_support(type) -> boolean();
swagger_support(default) -> true;
swagger_support(desc) -> ?DESC(swagger_support);
swagger_support(_) -> undefined.
%% TODO: change it to string type %% TODO: change it to string type
%% It will be up to the dashboard package which languages to support %% It will be up to the dashboard package which languages to support
i18n_lang(type) -> ?ENUM([en, zh]); i18n_lang(type) -> ?ENUM([en, zh]);

View File

@ -31,6 +31,7 @@
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
-include_lib("common_test/include/ct.hrl"). -include_lib("common_test/include/ct.hrl").
-include_lib("emqx/include/emqx.hrl"). -include_lib("emqx/include/emqx.hrl").
-include_lib("snabbkaffe/include/snabbkaffe.hrl").
-include("emqx_dashboard.hrl"). -include("emqx_dashboard.hrl").
-define(CONTENT_TYPE, "application/x-www-form-urlencoded"). -define(CONTENT_TYPE, "application/x-www-form-urlencoded").
@ -188,6 +189,38 @@ t_swagger_json(_Config) ->
), ),
ok. ok.
t_disable_swagger_json(_Config) ->
Url = ?HOST ++ "/api-docs/index.html",
?assertMatch(
{ok, {{"HTTP/1.1", 200, "OK"}, __, _}},
httpc:request(get, {Url, []}, [], [{body_format, binary}])
),
DashboardCfg = emqx:get_raw_config([dashboard]),
DashboardCfg2 = DashboardCfg#{<<"swagger_support">> => false},
emqx:update_config([dashboard], DashboardCfg2),
?retry(
_Sleep = 1000,
_Attempts = 5,
?assertMatch(
{ok, {{"HTTP/1.1", 404, "Not Found"}, _, _}},
httpc:request(get, {Url, []}, [], [{body_format, binary}])
)
),
DashboardCfg3 = DashboardCfg#{<<"swagger_support">> => true},
emqx:update_config([dashboard], DashboardCfg3),
?retry(
_Sleep0 = 1000,
_Attempts0 = 5,
?assertMatch(
{ok, {{"HTTP/1.1", 200, "OK"}, __, _}},
httpc:request(get, {Url, []}, [], [{body_format, binary}])
)
),
ok.
t_cli(_Config) -> t_cli(_Config) ->
[mria:dirty_delete(?ADMIN, Admin) || Admin <- mnesia:dirty_all_keys(?ADMIN)], [mria:dirty_delete(?ADMIN, Admin) || Admin <- mnesia:dirty_all_keys(?ADMIN)],
emqx_dashboard_cli:admins(["add", "username", "password_ww2"]), emqx_dashboard_cli:admins(["add", "username", "password_ww2"]),

View File

@ -0,0 +1 @@
Exposed the `swagger_support` option in configuration for Dashboard to disable the swagger API document.

View File

@ -143,4 +143,9 @@ ssl_options.desc:
ssl_options.label: ssl_options.label:
"""SSL options""" """SSL options"""
swagger_support.desc:
"""Enable or disable support for swagger API documentation."""
swagger_support.label:
"""Swagger Support"""
} }