refactor(emqx_gateway_schema): use hoconsc:map

This commit is contained in:
Zaiming Shi 2021-09-04 08:34:05 +02:00
parent 0039bfca6b
commit 3a60f00643
2 changed files with 62 additions and 81 deletions

View File

@ -405,7 +405,7 @@ fields("listeners") ->
}) })
} }
, {"quic", , {"quic",
sc(map(ref("mqtt_quic_listener")), sc(map(name, ref("mqtt_quic_listener")),
#{ desc => "QUIC listeners" #{ desc => "QUIC listeners"
, nullable => {true, recursive} , nullable => {true, recursive}
}) })

View File

@ -50,16 +50,16 @@ namespace() -> gateway.
roots() -> [gateway]. roots() -> [gateway].
fields(gateway) -> fields(gateway) ->
[{stomp, sc(ref(stomp_structs))}, [{stomp, sc(ref(stomp))},
{mqttsn, sc(ref(mqttsn_structs))}, {mqttsn, sc(ref(mqttsn))},
{coap, sc(ref(coap_structs))}, {coap, sc(ref(coap))},
{lwm2m, sc(ref(lwm2m_structs))}, {lwm2m, sc(ref(lwm2m))},
{exproto, sc(ref(exproto_structs))} {exproto, sc(ref(exproto))}
]; ];
fields(stomp_structs) -> fields(stomp) ->
[ {frame, sc(ref(stomp_frame))} [ {frame, sc(ref(stomp_frame))}
, {listeners, sc(ref(tcp_listener_group))} , {listeners, sc(ref(tcp_listeners))}
] ++ gateway_common_options(); ] ++ gateway_common_options();
fields(stomp_frame) -> fields(stomp_frame) ->
@ -68,12 +68,12 @@ fields(stomp_frame) ->
, {max_body_length, sc(integer(), 8192)} , {max_body_length, sc(integer(), 8192)}
]; ];
fields(mqttsn_structs) -> fields(mqttsn) ->
[ {gateway_id, sc(integer())} [ {gateway_id, sc(integer())}
, {broadcast, sc(boolean())} , {broadcast, sc(boolean())}
, {enable_qos3, sc(boolean())} , {enable_qos3, sc(boolean())}
, {predefined, hoconsc:array(ref(mqttsn_predefined))} , {predefined, hoconsc:array(ref(mqttsn_predefined))}
, {listeners, sc(ref(udp_listener_group))} , {listeners, sc(ref(udp_listeners))}
] ++ gateway_common_options(); ] ++ gateway_common_options();
fields(mqttsn_predefined) -> fields(mqttsn_predefined) ->
@ -81,34 +81,34 @@ fields(mqttsn_predefined) ->
, {topic, sc(binary())} , {topic, sc(binary())}
]; ];
fields(coap_structs) -> fields(coap) ->
[ {heartbeat, sc(duration(), <<"30s">>)} [ {heartbeat, sc(duration(), <<"30s">>)}
, {connection_required, sc(boolean(), false)} , {connection_required, sc(boolean(), false)}
, {notify_type, sc(union([non, con, qos]), qos)} , {notify_type, sc(hoconsc:union([non, con, qos]), qos)}
, {subscribe_qos, sc(union([qos0, qos1, qos2, coap]), coap)} , {subscribe_qos, sc(hoconsc:union([qos0, qos1, qos2, coap]), coap)}
, {publish_qos, sc(union([qos0, qos1, qos2, coap]), coap)} , {publish_qos, sc(hoconsc:union([qos0, qos1, qos2, coap]), coap)}
, {listeners, sc(ref(udp_listener_group))} , {listeners, sc(ref(udp_listeners))}
] ++ gateway_common_options(); ] ++ gateway_common_options();
fields(lwm2m_structs) -> fields(lwm2m) ->
[ {xml_dir, sc(binary())} [ {xml_dir, sc(binary())}
, {lifetime_min, sc(duration())} , {lifetime_min, sc(duration())}
, {lifetime_max, sc(duration())} , {lifetime_max, sc(duration())}
, {qmode_time_windonw, sc(integer())} , {qmode_time_windonw, sc(integer())}
, {auto_observe, sc(boolean())} , {auto_observe, sc(boolean())}
, {update_msg_publish_condition, sc(union([always, contains_object_list]))} , {update_msg_publish_condition, sc(hoconsc:union([always, contains_object_list]))}
, {translators, sc(ref(translators))} , {translators, sc(ref(translators))}
, {listeners, sc(ref(udp_listener_group))} , {listeners, sc(ref(udp_listeners))}
] ++ gateway_common_options(); ] ++ gateway_common_options();
fields(exproto_structs) -> fields(exproto) ->
[ {server, sc(ref(exproto_grpc_server))} [ {server, sc(ref(exproto_grpc_server))}
, {handler, sc(ref(exproto_grpc_handler))} , {handler, sc(ref(exproto_grpc_handler))}
, {listeners, sc(ref(udp_tcp_listener_group))} , {listeners, sc(ref(udp_tcp_listeners))}
] ++ gateway_common_options(); ] ++ gateway_common_options();
fields(exproto_grpc_server) -> fields(exproto_grpc_server) ->
[ {bind, sc(union(ip_port(), integer()))} [ {bind, sc(hoconsc:union([ip_port(), integer()]))}
%% TODO: ssl options %% TODO: ssl options
]; ];
@ -136,62 +136,45 @@ fields(translator) ->
, {qos, sc(range(0, 2))} , {qos, sc(range(0, 2))}
]; ];
fields(udp_listener_group) -> fields(udp_listeners) ->
[ {udp, sc(ref(udp_listener))} [ {udp, sc(map(name, ref(udp_listener)))}
, {dtls, sc(ref(dtls_listener))} , {dtls, sc(map(name, ref(dtls_listener)))}
]; ];
fields(tcp_listener_group) -> fields(tcp_listeners) ->
[ {tcp, sc(ref(tcp_listener))} [ {tcp, sc(map(name, ref(tcp_listener)))}
, {ssl, sc(ref(ssl_listener))} , {ssl, sc(map(name, ref(ssl_listener)))}
]; ];
fields(udp_tcp_listener_group) -> fields(udp_tcp_listeners) ->
[ {udp, sc(ref(udp_listener))} [ {udp, sc(map(name, ref(udp_listener)))}
, {dtls, sc(ref(dtls_listener))} , {dtls, sc(map(name, ref(dtls_listener)))}
, {tcp, sc(ref(tcp_listener))} , {tcp, sc(map(name, ref(tcp_listener)))}
, {ssl, sc(ref(ssl_listener))} , {ssl, sc(map(name, ref(ssl_listener)))}
]; ];
fields(tcp_listener) -> fields(tcp_listener) ->
[ {"$name", sc(ref(tcp_listener_settings))}];
fields(ssl_listener) ->
[ {"$name", sc(ref(ssl_listener_settings))}];
fields(udp_listener) ->
[ {"$name", sc(ref(udp_listener_settings))}];
fields(dtls_listener) ->
[ {"$name", sc(ref(dtls_listener_settings))}];
fields(tcp_listener_settings) ->
[ [
%% some special confs for tcp listener %% some special confs for tcp listener
] ++ tcp_opts() ] ++
++ proxy_protocol_opts() tcp_opts() ++
++ common_listener_opts(); proxy_protocol_opts() ++
common_listener_opts();
fields(ssl_listener_settings) -> fields(ssl_listener) ->
[ fields(tcp_listener) ++
%% some special confs for ssl listener ssl_opts();
] ++ tcp_opts()
++ ssl_opts()
++ proxy_protocol_opts()
++ common_listener_opts();
fields(udp_listener_settings) -> fields(udp_listener) ->
[ [
%% some special confs for udp listener %% some special confs for udp listener
] ++ udp_opts() ] ++
++ common_listener_opts(); udp_opts() ++
common_listener_opts();
fields(dtls_listener_settings) -> fields(dtls_listener) ->
[ fields(udp_listener) ++
%% some special confs for dtls listener dtls_opts();
] ++ udp_opts()
++ dtls_opts()
++ common_listener_opts();
fields(udp_opts) -> fields(udp_opts) ->
[ {active_n, sc(integer(), 100)} [ {active_n, sc(integer(), 100)}
@ -218,11 +201,7 @@ fields(dtls_listener_ssl_opts) ->
lists:keyreplace("versions", 1, Base, {"versions", DtlsVers}), lists:keyreplace("versions", 1, Base, {"versions", DtlsVers}),
{"ciphers", Ciphers} {"ciphers", Ciphers}
) )
); ).
fields(ExtraField) ->
Mod = list_to_atom(ExtraField++"_schema"),
Mod:fields(ExtraField).
default_ciphers() -> default_ciphers() ->
["ECDHE-ECDSA-AES256-GCM-SHA384", ["ECDHE-ECDSA-AES256-GCM-SHA384",
@ -286,16 +265,16 @@ common_listener_opts() ->
]. ].
tcp_opts() -> tcp_opts() ->
[{tcp, sc(ref(emqx_schema, "tcp_opts"), #{})}]. [{tcp, sc_meta(ref(emqx_schema, "tcp_opts"), #{})}].
udp_opts() -> udp_opts() ->
[{udp, sc(ref(udp_opts), #{})}]. [{udp, sc_meta(ref(udp_opts), #{})}].
ssl_opts() -> ssl_opts() ->
[{ssl, sc(ref(emqx_schema, "listener_ssl_opts"), #{})}]. [{ssl, sc_meta(ref(emqx_schema, "listener_ssl_opts"), #{})}].
dtls_opts() -> dtls_opts() ->
[{dtls, sc(ref(dtls_listener_ssl_opts), #{})}]. [{dtls, sc_meta(ref(dtls_listener_ssl_opts), #{})}].
proxy_protocol_opts() -> proxy_protocol_opts() ->
[ {proxy_protocol, sc(boolean())} [ {proxy_protocol, sc(boolean())}
@ -308,18 +287,20 @@ default_dtls_vsns() ->
dtls_vsn(<<"dtlsv1.2">>) -> 'dtlsv1.2'; dtls_vsn(<<"dtlsv1.2">>) -> 'dtlsv1.2';
dtls_vsn(<<"dtlsv1">>) -> 'dtlsv1'. dtls_vsn(<<"dtlsv1">>) -> 'dtlsv1'.
%%-------------------------------------------------------------------- sc(Type) ->
%% Helpers sc_meta(Type, #{}).
%% types
sc(Type) -> #{type => Type}.
sc(Type, Default) -> sc(Type, Default) ->
hoconsc:mk(Type, #{default => Default}). sc_meta(Type, #{default => Default}).
ref(Field) -> sc_meta(Type, Meta) ->
hoconsc:ref(?MODULE, Field). hoconsc:mk(Type, Meta).
map(Name, Type) ->
hoconsc: map(Name, Type).
ref(StructName) ->
ref(?MODULE, StructName).
ref(Mod, Field) -> ref(Mod, Field) ->
hoconsc:ref(Mod, Field). hoconsc:ref(Mod, Field).