Просмотр исходного кода

feat: add a escript to help re-format older version schema dumps

Zaiming (Stone) Shi 2 лет назад
Родитель
Сommit
b643741920
1 измененных файлов с 132 добавлено и 0 удалено
  1. 132 0
      scripts/schema-dump-reformat.escript

+ 132 - 0
scripts/schema-dump-reformat.escript

@@ -0,0 +1,132 @@
+#!/usr/bin/env escript
+
+%% This script translates the hocon_schema_json's schema dump to a new format.
+%% It is used to convert older version EMQX's schema dumps to the new format
+%% after all files are upgraded to the new format, this script can be removed.
+
+-mode(compile).
+
+main([Input]) ->
+    ok = add_libs(),
+    _ = atoms(),
+    {ok, Data} = file:read_file(Input),
+    Json = jsx:decode(Data),
+    NewJson = reformat(Json),
+    io:format("~s~n", [jsx:encode(NewJson)]);
+main(_) ->
+    io:format("Usage: schema-dump-reformat.escript <input.json>~n"),
+    halt(1).
+
+reformat(Json) ->
+    emqx_conf:reformat_schema_dump(fix(Json)).
+
+%% fix old type specs to make them compatible with new type specs
+fix(#{
+    <<"kind">> := <<"union">>,
+    <<"members">> := [#{<<"name">> := <<"string()">>}, #{<<"name">> := <<"function()">>}]
+}) ->
+    %% s3_exporter.secret_access_key
+    #{
+        kind => primitive,
+        name => <<"string()">>
+    };
+fix(#{<<"kind">> := <<"primitive">>, <<"name">> := <<"emqx_conf_schema:log_level()">>}) ->
+    #{
+        kind => enum,
+        symbols => [emergency, alert, critical, error, warning, notice, info, debug, none, all]
+    };
+fix(#{<<"kind">> := <<"primitive">>, <<"name">> := <<"emqx_connector_http:pool_type()">>}) ->
+    #{kind => enum, symbols => [random, hash]};
+fix(#{<<"kind">> := <<"primitive">>, <<"name">> := <<"emqx_bridge_http_connector:pool_type()">>}) ->
+    #{kind => enum, symbols => [random, hash]};
+fix(Map) when is_map(Map) ->
+    maps:from_list(fix(maps:to_list(Map)));
+fix(List) when is_list(List) ->
+    lists:map(fun fix/1, List);
+fix({<<"kind">>, Kind}) ->
+    {kind, binary_to_atom(Kind, utf8)};
+fix({<<"name">>, Type}) ->
+    {name, fix_type(Type)};
+fix({K, V}) ->
+    {binary_to_atom(K, utf8), fix(V)};
+fix(V) when is_number(V) ->
+    V;
+fix(V) when is_atom(V) ->
+    V;
+fix(V) when is_binary(V) ->
+    V.
+
+%% ensure below ebin dirs are added to code path:
+%% _build/default/lib/*/ebin
+%% _build/emqx/lib/*/ebin
+%% _build/emqx-enterprise/lib/*/ebin
+add_libs() ->
+    Profile = os:getenv("PROFILE"),
+    case Profile of
+        "emqx" ->
+            ok;
+        "emqx-enterprise" ->
+            ok;
+        _ ->
+            io:format("PROFILE is not set~n"),
+            halt(1)
+    end,
+    Dirs =
+        filelib:wildcard("_build/default/lib/*/ebin") ++
+            filelib:wildcard("_build/" ++ Profile ++ "/lib/*/ebin"),
+    lists:foreach(fun add_lib/1, Dirs).
+
+add_lib(Dir) ->
+    code:add_patha(Dir),
+    Beams = filelib:wildcard(Dir ++ "/*.beam"),
+    _ = spawn(fun() -> lists:foreach(fun load_beam/1, Beams) end),
+    ok.
+
+load_beam(BeamFile) ->
+    ModuleName = filename:basename(BeamFile, ".beam"),
+    Module = list_to_atom(ModuleName),
+    %% load the beams to make sure the atoms are existing
+    code:ensure_loaded(Module),
+    ok.
+
+fix_type(<<"[{string(), string()}]">>) ->
+    <<"map()">>;
+fix_type(<<"[{binary(), binary()}]">>) ->
+    <<"map()">>;
+fix_type(<<"emqx_limiter_schema:rate()">>) ->
+    <<"string()">>;
+fix_type(<<"emqx_limiter_schema:burst_rate()">>) ->
+    <<"string()">>;
+fix_type(<<"emqx_limiter_schema:capacity()">>) ->
+    <<"string()">>;
+fix_type(<<"emqx_limiter_schema:initial()">>) ->
+    <<"string()">>;
+fix_type(<<"emqx_limiter_schema:failure_strategy()">>) ->
+    <<"string()">>;
+fix_type(<<"emqx_conf_schema:file()">>) ->
+    <<"string()">>;
+fix_type(<<"#{term() => binary()}">>) ->
+    <<"map()">>;
+fix_type(<<"[term()]">>) ->
+    %% jwt claims
+    <<"map()">>;
+fix_type(<<"emqx_ee_bridge_influxdb:write_syntax()">>) ->
+    <<"string()">>;
+fix_type(<<"emqx_bridge_influxdb:write_syntax()">>) ->
+    <<"string()">>;
+fix_type(<<"emqx_schema:mqtt_max_packet_size()">>) ->
+    <<"non_neg_integer()">>;
+fix_type(<<"emqx_s3_schema:secret_access_key()">>) ->
+    <<"string()">>;
+fix_type(Type) ->
+    Type.
+
+%% ensure atoms are loaded
+%% these atoms are from older version of emqx
+atoms() ->
+    [
+        emqx_ee_connector_clickhouse,
+        emqx_ee_bridge_gcp_pubsub,
+        emqx_ee_bridge_influxdb,
+        emqx_connector_http
+    ].