chore(gw): improve examples for _gateway_api

This commit is contained in:
JianBo He 2021-12-08 17:18:39 +08:00
parent e48f10d2d6
commit 7c261b5356
2 changed files with 169 additions and 7 deletions

View File

@ -153,10 +153,14 @@ schema("/gateway") ->
#{ description => <<"Get gateway list">> #{ description => <<"Get gateway list">>
, parameters => params_gateway_status_in_qs() , parameters => params_gateway_status_in_qs()
, responses => , responses =>
?STANDARD_RESP(#{200 => ref(gateway_overview)}) ?STANDARD_RESP(
#{200 => emqx_dashboard_swagger:schema_with_example(
hoconsc:array(ref(gateway_overview)),
examples_gateway_overview())})
}, },
post => post =>
#{ description => <<"Load a gateway">> #{ description => <<"Load a gateway">>
%% TODO: distinguish create & response swagger schema
, 'requestBody' => schema_gateways_conf() , 'requestBody' => schema_gateways_conf()
, responses => , responses =>
?STANDARD_RESP(#{201 => schema_gateways_conf()}) ?STANDARD_RESP(#{201 => schema_gateways_conf()})
@ -179,7 +183,7 @@ schema("/gateway/:name") ->
put => put =>
#{ description => <<"Update the gateway configurations/status">> #{ description => <<"Update the gateway configurations/status">>
, parameters => params_gateway_name_in_path() , parameters => params_gateway_name_in_path()
, 'requestBody' => schema_gateways_conf() , 'requestBody' => schema_update_gateways_conf()
, responses => , responses =>
?STANDARD_RESP(#{200 => schema_gateways_conf()}) ?STANDARD_RESP(#{200 => schema_gateways_conf()})
} }
@ -210,6 +214,7 @@ params_gateway_name_in_path() ->
]. ].
params_gateway_status_in_qs() -> params_gateway_status_in_qs() ->
%% FIXME: enum in swagger ??
[{status, [{status,
mk(binary(), mk(binary(),
#{ in => query #{ in => query
@ -274,6 +279,14 @@ fields(Gw) when Gw == stomp; Gw == mqttsn;
[{name, [{name,
mk(hoconsc:union([Gw]), #{ desc => <<"Gateway Name">>})} mk(hoconsc:union([Gw]), #{ desc => <<"Gateway Name">>})}
] ++ convert_listener_struct(emqx_gateway_schema:fields(Gw)); ] ++ convert_listener_struct(emqx_gateway_schema:fields(Gw));
fields(Gw) when Gw == update_stomp; Gw == update_mqttsn;
Gw == update_coap; Gw == update_lwm2m;
Gw == update_exproto ->
"update_" ++ GwStr = atom_to_list(Gw),
Gw1 = list_to_existing_atom(GwStr),
remove_listener_and_authn(emqx_gateway_schema:fields(Gw1));
fields(Listener) when Listener == tcp_listener; fields(Listener) when Listener == tcp_listener;
Listener == ssl_listener; Listener == ssl_listener;
Listener == udp_listener; Listener == udp_listener;
@ -297,9 +310,17 @@ fields(Listener) when Listener == tcp_listener;
fields(gateway_stats) -> fields(gateway_stats) ->
[{key, mk(binary(), #{})}]. [{key, mk(binary(), #{})}].
schema_update_gateways_conf() ->
emqx_dashboard_swagger:schema_with_examples(
hoconsc:union([ref(?MODULE, update_stomp),
ref(?MODULE, update_mqttsn),
ref(?MODULE, update_coap),
ref(?MODULE, update_lwm2m),
ref(?MODULE, update_exproto)]),
examples_update_gateway_confs()
).
schema_gateways_conf() -> schema_gateways_conf() ->
%% XXX: We need convert the emqx_gateway_schema's listener map
%% structure to array
emqx_dashboard_swagger:schema_with_examples( emqx_dashboard_swagger:schema_with_examples(
hoconsc:union([ref(?MODULE, stomp), ref(?MODULE, mqttsn), hoconsc:union([ref(?MODULE, stomp), ref(?MODULE, mqttsn),
ref(?MODULE, coap), ref(?MODULE, lwm2m), ref(?MODULE, coap), ref(?MODULE, lwm2m),
@ -316,6 +337,11 @@ convert_listener_struct(Schema) ->
}), }),
lists:keystore(listeners, 1, Schema1, {listeners, ListenerSchema}). lists:keystore(listeners, 1, Schema1, {listeners, ListenerSchema}).
remove_listener_and_authn(Schmea) ->
lists:keydelete(
authentication, 1,
lists:keydelete(listeners, 1, Schmea)).
listeners_schema(?R_REF(_Mod, tcp_listeners)) -> listeners_schema(?R_REF(_Mod, tcp_listeners)) ->
hoconsc:array(hoconsc:union([ref(tcp_listener), ref(ssl_listener)])); hoconsc:array(hoconsc:union([ref(tcp_listener), ref(ssl_listener)]));
listeners_schema(?R_REF(_Mod, udp_listeners)) -> listeners_schema(?R_REF(_Mod, udp_listeners)) ->
@ -327,6 +353,57 @@ listeners_schema(?R_REF(_Mod, udp_tcp_listeners)) ->
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% examples %% examples
examples_gateway_overview() ->
[ #{ name => <<"coap">>
, status => <<"unloaded">>
}
, #{ name => <<"exproto">>
, status => <<"unloaded">>
}
, #{ name => <<"lwm2m">>
, status => <<"running">>
, current_connections => 0
, max_connections => 1024000
, listeners =>
[ #{ id => <<"lwm2m:udp:default">>
, type => <<"udp">>
, name => <<"default">>
, running => true
}
]
, created_at => <<"2021-12-08T14:41:26.171+08:00">>
, started_at => <<"2021-12-08T14:41:26.202+08:00">>
}
, #{ name => <<"mqttsn">>
, status => <<"stopped">>
, current_connections => 0
, max_connections => 1024000
, listeners =>
[ #{ id => <<"mqttsn:udp:default">>
, name => <<"default">>
, running => false
, type => <<"udp">>
}
]
, created_at => <<"2021-12-08T14:41:45.071+08:00">>
, stopped_at => <<"2021-12-08T14:56:35.576+08:00">>
}
, #{ name => <<"stomp">>
, status => <<"running">>
, current_connections => 0
, max_connections => 1024000
, listeners =>
[ #{ id => <<"stomp:tcp:default">>
, name => <<"default">>
, running => true
, type => <<"tcp">>
}
]
, created_at => <<"2021-12-08T14:42:15.272+08:00">>
, started_at => <<"2021-12-08T14:42:15.274+08:00">>
}
].
examples_gateway_confs() -> examples_gateway_confs() ->
#{ stomp_gateway => #{ stomp_gateway =>
#{ summary => <<"A simple STOMP gateway configs">> #{ summary => <<"A simple STOMP gateway configs">>
@ -395,7 +472,7 @@ examples_gateway_confs() ->
, publish_qos => <<"coap">> , publish_qos => <<"coap">>
, listeners => , listeners =>
[ #{ type => <<"udp">> [ #{ type => <<"udp">>
, name => <<"coap">> , name => <<"default">>
, bind => <<"5683">> , bind => <<"5683">>
, max_connections => 1024000 , max_connections => 1024000
, max_conn_rate => 1000 , max_conn_rate => 1000
@ -426,7 +503,7 @@ examples_gateway_confs() ->
} }
, listeners => , listeners =>
[ #{ type => <<"udp">> [ #{ type => <<"udp">>
, name => <<"lwm2m">> , name => <<"default">>
, bind => <<"5783">> , bind => <<"5783">>
, max_connections => 1024000 , max_connections => 1024000
, max_conn_rate => 1000 , max_conn_rate => 1000
@ -460,5 +537,90 @@ examples_gateway_confs() ->
} }
}. }.
examples_update_gateway_confs() ->
#{ stomp_gateway =>
#{ summary => <<"A simple STOMP gateway configs">>
, value =>
#{ enable => true
, enable_stats => true
, idle_timeout => <<"30s">>
, mountpoint => <<"stomp2/">>
, frame =>
#{ max_headers => 100
, max_headers_length => 10240
, max_body_length => 655350
}
}
}
, mqttsn_gateway =>
#{ summary => <<"A simple MQTT-SN gateway configs">>
, value =>
#{ enable => true
, enable_stats => true
, idle_timeout => <<"30s">>
, mountpoint => <<"mqttsn2/">>
, gateway_id => 1
, broadcast => true
, enable_qos3 => false
, predefined =>
[ #{ id => <<"1003">>
, topic => <<"pred/1003">>
}
]
}
}
, coap_gateway =>
#{ summary => <<"A simple CoAP gateway configs">>
, value =>
#{ enable => true
, enable_stats => true
, idle_timeout => <<"30s">>
, mountpoint => <<"coap2/">>
, heartbeat => <<"30s">>
, connection_required => false
, notify_type => <<"qos">>
, subscribe_qos => <<"coap">>
, publish_qos => <<"coap">>
}
}
, lwm2m_gateway =>
#{ summary => <<"A simple LwM2M gateway configs">>
, value =>
#{ enable => true
, enable_stats => true
, idle_timeout => <<"30s">>
, mountpoint => <<"lwm2m2/">>
, xml_dir => <<"etc/lwm2m_xml">>
, lifetime_min => <<"1s">>
, lifetime_max => <<"86400s">>
, qmode_time_window => <<"22s">>
, auto_observe => false
, update_msg_publish_condition => <<"always">>
, translators =>
#{ command => #{topic => <<"/dn/#">>}
, response => #{topic => <<"/up/resp">>}
, notify => #{topic => <<"/up/notify">>}
, register => #{topic => <<"/up/resp">>}
, update => #{topic => <<"/up/resp">>}
}
}
}
, exproto_gateway =>
#{ summary => <<"A simple ExProto gateway configs">>
, value =>
#{ enable => true
, enable_stats => true
, idle_timeout => <<"30s">>
, mountpoint => <<"exproto2/">>
, server =>
#{ bind => <<"9100">>
}
, handler =>
#{ address => <<"http://127.0.0.1:9001">>
}
}
}
}.
examples_gateway_stats() -> examples_gateway_stats() ->
#{}. #{}.

View File

@ -61,7 +61,7 @@ start_grpc_server(GwName, Options = #{bind := ListenOn}) ->
end, end,
case grpc:start_server(GwName, ListenOn, Services, SvrOptions) of case grpc:start_server(GwName, ListenOn, Services, SvrOptions) of
{ok, _SvrPid} -> {ok, _SvrPid} ->
console_print("Start ~ts gRPC server on ~p successfully.", console_print("Start ~ts gRPC server on ~p successfully.~n",
[GwName, ListenOn]); [GwName, ListenOn]);
{error, Reason} -> {error, Reason} ->
?ELOG("Falied to start ~ts gRPC server on ~p, reason: ~p", ?ELOG("Falied to start ~ts gRPC server on ~p, reason: ~p",