feat(gw): add the http api skeleton
This commit is contained in:
parent
9893c0263a
commit
75dc4ea9a2
|
@ -0,0 +1,389 @@
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% Copyright (c) 2021 EMQ Technologies Co., Ltd. All Rights Reserved.
|
||||||
|
%%
|
||||||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
%% you may not use this file except in compliance with the License.
|
||||||
|
%% You may obtain a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing, software
|
||||||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
%% See the License for the specific language governing permissions and
|
||||||
|
%% limitations under the License.
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%%
|
||||||
|
-module(emqx_gateway_api).
|
||||||
|
|
||||||
|
-behaviour(minirest_api).
|
||||||
|
|
||||||
|
-compile(nowarn_unused_function).
|
||||||
|
|
||||||
|
%% minirest behaviour callbacks
|
||||||
|
-export([api_spec/0]).
|
||||||
|
|
||||||
|
%% http handlers
|
||||||
|
-export([ gateway/2
|
||||||
|
, gateway_insta/2
|
||||||
|
]).
|
||||||
|
|
||||||
|
-define(EXAMPLE_GATEWAY_LIST,
|
||||||
|
[ #{ name => <<"lwm2m">>
|
||||||
|
, status => <<"running">>
|
||||||
|
, started_at => <<"2021-08-19T11:45:56.006373+08:00">>
|
||||||
|
, max_connection => 1024000
|
||||||
|
, current_connection => 12
|
||||||
|
, listeners => [
|
||||||
|
#{name => <<"lw-udp-1">>, status => <<"activing">>},
|
||||||
|
#{name => <<"lw-udp-2">>, status => <<"inactived">>}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]).
|
||||||
|
|
||||||
|
-define(EXAMPLE_STOMP_GATEWAY_CONF, #{
|
||||||
|
frame => #{
|
||||||
|
max_headers => 10,
|
||||||
|
max_headers_length => 1024,
|
||||||
|
max_body_length => 8192
|
||||||
|
},
|
||||||
|
listener => #{
|
||||||
|
tcp => #{<<"default-stomp-listener">> => #{
|
||||||
|
bind => <<"61613">>
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
}).
|
||||||
|
|
||||||
|
-define(EXAMPLE_MQTTSN_GATEWAY_CONF, #{
|
||||||
|
}).
|
||||||
|
|
||||||
|
-define(EXAMPLE_GATEWAY_STATS, #{
|
||||||
|
max_connection => 10240000,
|
||||||
|
current_connection => 1000,
|
||||||
|
messages_in => 100.24,
|
||||||
|
messages_out => 32.5
|
||||||
|
}).
|
||||||
|
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% minirest behaviour callbacks
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
|
api_spec() ->
|
||||||
|
{apis(), schemas()}.
|
||||||
|
|
||||||
|
apis() ->
|
||||||
|
[ {"/gateway", metadata(gateway), gateway}
|
||||||
|
, {"/gateway/:name", metadata(gateway_insta), gateway_insta}
|
||||||
|
, {"/gateway/:name/stats", metadata(gateway_insta_stats), gateway_insta_stats}
|
||||||
|
].
|
||||||
|
|
||||||
|
metadata(gateway) ->
|
||||||
|
#{get => #{
|
||||||
|
description => <<"Get gateway list">>,
|
||||||
|
parameters => [
|
||||||
|
#{name => status,
|
||||||
|
in => query,
|
||||||
|
schema => #{type => string},
|
||||||
|
required => false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
responses => #{
|
||||||
|
<<"200">> => #{
|
||||||
|
description => <<"OK">>,
|
||||||
|
content => #{
|
||||||
|
'application/json' => #{
|
||||||
|
schema => minirest:ref(<<"gateway_overrview">>),
|
||||||
|
examples => #{
|
||||||
|
simple => #{
|
||||||
|
summary => <<"Gateway List Example">>,
|
||||||
|
value => emqx_json:encode(?EXAMPLE_GATEWAY_LIST)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}};
|
||||||
|
|
||||||
|
metadata(gateway_insta) ->
|
||||||
|
UriNameParamDef = #{name => name,
|
||||||
|
in => path,
|
||||||
|
schema => #{type => string},
|
||||||
|
required => true
|
||||||
|
},
|
||||||
|
NameNotFoundRespDef =
|
||||||
|
#{description => <<"Not Found">>,
|
||||||
|
content => #{
|
||||||
|
'application/json' => #{
|
||||||
|
schema => minirest:ref(<<"error">>),
|
||||||
|
examples => #{
|
||||||
|
simple => #{
|
||||||
|
summary => <<"Not Found">>,
|
||||||
|
value => #{
|
||||||
|
code => <<"NOT_FOUND">>,
|
||||||
|
message => <<"gateway xxx not found">>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
#{delete => #{
|
||||||
|
description => <<"Delete/Unload the gateway">>,
|
||||||
|
parameters => [UriNameParamDef],
|
||||||
|
responses => #{
|
||||||
|
<<"404">> => NameNotFoundRespDef,
|
||||||
|
<<"204">> => #{description => <<"No Content">>}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
get => #{
|
||||||
|
description => <<"Get the gateway configurations">>,
|
||||||
|
parameters => [UriNameParamDef],
|
||||||
|
responses => #{
|
||||||
|
<<"404">> => NameNotFoundRespDef,
|
||||||
|
<<"200">> => #{
|
||||||
|
description => <<"OK">>,
|
||||||
|
content => #{
|
||||||
|
'application/json' => #{
|
||||||
|
schema => minirest:ref(<<"gateway_conf">>),
|
||||||
|
examples => #{
|
||||||
|
simple1 => #{
|
||||||
|
summary => <<"Stomp Gateway">>,
|
||||||
|
value => emqx_json:encode(?EXAMPLE_STOMP_GATEWAY_CONF)
|
||||||
|
},
|
||||||
|
simple2 => #{
|
||||||
|
summary => <<"MQTT-SN Gateway">>,
|
||||||
|
value => emqx_json:encode(?EXAMPLE_MQTTSN_GATEWAY_CONF)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
put => #{
|
||||||
|
description => <<"Update the gateway configurations/status">>,
|
||||||
|
parameters => [UriNameParamDef],
|
||||||
|
requestBody => #{
|
||||||
|
content => #{
|
||||||
|
'application/json' => #{
|
||||||
|
schema => minirest:ref(<<"gateway_conf">>),
|
||||||
|
examples => #{
|
||||||
|
simple1 => #{
|
||||||
|
summary => <<"Stom Gateway">>,
|
||||||
|
value => emqx_json:encode(?EXAMPLE_STOMP_GATEWAY_CONF)
|
||||||
|
},
|
||||||
|
simple2 => #{
|
||||||
|
summary => <<"MQTT-SN Gateway">>,
|
||||||
|
value => emqx_json:encode(?EXAMPLE_MQTTSN_GATEWAY_CONF)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
responses => #{
|
||||||
|
<<"404">> => NameNotFoundRespDef,
|
||||||
|
<<"204">> => #{description => <<"Created">>}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
metadata(gateway_insta_stats) ->
|
||||||
|
#{get => #{
|
||||||
|
description => <<"Get gateway Statistic">>,
|
||||||
|
responses => #{
|
||||||
|
<<"200">> => #{
|
||||||
|
description => <<"OK">>,
|
||||||
|
content => #{
|
||||||
|
'application/json' => #{
|
||||||
|
schema => minirest:ref(<<"gateway_stats">>),
|
||||||
|
examples => #{
|
||||||
|
simple => #{
|
||||||
|
summary => <<"Gateway Statistic">>,
|
||||||
|
value => emqx_json:encode(?EXAMPLE_GATEWAY_STATS)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}.
|
||||||
|
|
||||||
|
schemas() ->
|
||||||
|
[ #{<<"gateway_overrview">> => schema_for_gateway_overrview()}
|
||||||
|
, #{<<"gateway_conf">> => schema_for_gateway_conf()}
|
||||||
|
, #{<<"gateway_stats">> => schema_for_gateway_stats()}
|
||||||
|
].
|
||||||
|
|
||||||
|
schema_for_gateway_overrview() ->
|
||||||
|
#{type => array,
|
||||||
|
items => #{
|
||||||
|
type => object,
|
||||||
|
properties => #{
|
||||||
|
name => #{
|
||||||
|
type => string,
|
||||||
|
example => <<"lwm2m">>
|
||||||
|
},
|
||||||
|
status => #{
|
||||||
|
type => string,
|
||||||
|
enum => [<<"running">>, <<"stopped">>, <<"unloaded">>],
|
||||||
|
example => <<"running">>
|
||||||
|
},
|
||||||
|
started_at => #{
|
||||||
|
type => string,
|
||||||
|
example => <<"2021-08-19T11:45:56.006373+08:00">>
|
||||||
|
},
|
||||||
|
max_connection => #{
|
||||||
|
type => integer,
|
||||||
|
example => 1024000
|
||||||
|
},
|
||||||
|
current_connection => #{
|
||||||
|
type => integer,
|
||||||
|
example => 1000
|
||||||
|
},
|
||||||
|
listeners => #{
|
||||||
|
type => array,
|
||||||
|
items => #{
|
||||||
|
type => object,
|
||||||
|
properties => #{
|
||||||
|
name => #{
|
||||||
|
type => string,
|
||||||
|
example => <<"lw-udp">>
|
||||||
|
},
|
||||||
|
status => #{
|
||||||
|
type => string,
|
||||||
|
enum => [<<"activing">>, <<"inactived">>]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.
|
||||||
|
|
||||||
|
schema_for_gateway_conf() ->
|
||||||
|
#{oneOf =>
|
||||||
|
[ schema_for_gateway_conf_stomp()
|
||||||
|
, schema_for_gateway_conf_mqttsn()
|
||||||
|
, schema_for_gateway_conf_coap()
|
||||||
|
, schema_for_gateway_conf_lwm2m()
|
||||||
|
, schema_for_gateway_conf_exproto()
|
||||||
|
]}.
|
||||||
|
|
||||||
|
schema_for_clientinfo_override() ->
|
||||||
|
#{type => object,
|
||||||
|
properties => #{
|
||||||
|
clientid => #{type => string},
|
||||||
|
username => #{type => string},
|
||||||
|
password => #{type => string}
|
||||||
|
}}.
|
||||||
|
|
||||||
|
schema_for_authenticator() ->
|
||||||
|
%% TODO.
|
||||||
|
#{type => object, properties => #{
|
||||||
|
a_key => #{type => string}
|
||||||
|
}}.
|
||||||
|
|
||||||
|
schema_for_tcp_listener() ->
|
||||||
|
%% TODO.
|
||||||
|
#{type => object, properties => #{
|
||||||
|
a_key => #{type => string}
|
||||||
|
}}.
|
||||||
|
|
||||||
|
schema_for_udp_listener() ->
|
||||||
|
%% TODO.
|
||||||
|
#{type => object, properties => #{
|
||||||
|
a_key => #{type => string}
|
||||||
|
}}.
|
||||||
|
|
||||||
|
%% It should be generated by _schema.erl module
|
||||||
|
%% and emqx_gateway.conf
|
||||||
|
schema_for_gateway_conf_stomp() ->
|
||||||
|
#{type => object,
|
||||||
|
properties => #{
|
||||||
|
frame => #{
|
||||||
|
type => object,
|
||||||
|
properties => #{
|
||||||
|
max_headers => #{type => integer},
|
||||||
|
max_headers_length => #{type => integer},
|
||||||
|
max_body_length => #{type => integer}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
clientinfo_override => schema_for_clientinfo_override(),
|
||||||
|
authenticator => schema_for_authenticator(),
|
||||||
|
listener => schema_for_tcp_listener()
|
||||||
|
}
|
||||||
|
}.
|
||||||
|
|
||||||
|
schema_for_gateway_conf_mqttsn() ->
|
||||||
|
#{type => object,
|
||||||
|
properties => #{
|
||||||
|
gateway_id => #{type => integer},
|
||||||
|
broadcast => #{type => boolean},
|
||||||
|
enable_stats => #{type => boolean},
|
||||||
|
enable_qos3 => #{type => boolean},
|
||||||
|
idle_timeout => #{type => integer},
|
||||||
|
predefined => #{
|
||||||
|
type => array,
|
||||||
|
items => #{
|
||||||
|
type => object,
|
||||||
|
properties => #{
|
||||||
|
id => #{type => integer},
|
||||||
|
topic => #{type => string}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
clientinfo_override => schema_for_clientinfo_override(),
|
||||||
|
authenticator => schema_for_authenticator(),
|
||||||
|
listener => schema_for_udp_listener()
|
||||||
|
}}.
|
||||||
|
|
||||||
|
|
||||||
|
schema_for_gateway_conf_coap() ->
|
||||||
|
#{type => object,
|
||||||
|
properties => #{
|
||||||
|
clientinfo_override => schema_for_clientinfo_override(),
|
||||||
|
authenticator => schema_for_authenticator(),
|
||||||
|
listener => schema_for_udp_listener()
|
||||||
|
}}.
|
||||||
|
|
||||||
|
schema_for_gateway_conf_lwm2m() ->
|
||||||
|
#{type => object,
|
||||||
|
properties => #{
|
||||||
|
clientinfo_override => schema_for_clientinfo_override(),
|
||||||
|
authenticator => schema_for_authenticator(),
|
||||||
|
listener => schema_for_udp_listener()
|
||||||
|
}}.
|
||||||
|
|
||||||
|
schema_for_gateway_conf_exproto() ->
|
||||||
|
#{type => object,
|
||||||
|
properties => #{
|
||||||
|
clientinfo_override => schema_for_clientinfo_override(),
|
||||||
|
authenticator => schema_for_authenticator(),
|
||||||
|
listener => #{oneOf => [schema_for_tcp_listener(),
|
||||||
|
schema_for_udp_listener()
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}}.
|
||||||
|
|
||||||
|
schema_for_gateway_stats() ->
|
||||||
|
#{type => object,
|
||||||
|
properties => #{
|
||||||
|
a_key => #{type => string}
|
||||||
|
}}.
|
||||||
|
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% http handlers
|
||||||
|
|
||||||
|
gateway(get, _Request) ->
|
||||||
|
{200, ok}.
|
||||||
|
|
||||||
|
gateway_insta(delete, _Request) ->
|
||||||
|
{200, ok};
|
||||||
|
gateway_insta(get, _Request) ->
|
||||||
|
{200, ok};
|
||||||
|
gateway_insta(put, _Request) ->
|
||||||
|
{200, ok}.
|
||||||
|
|
||||||
|
gateway_insta_stats(get, _Req) ->
|
||||||
|
{401, <<"Implement it later (maybe 5.1)">>}.
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% Copyright (c) 2021 EMQ Technologies Co., Ltd. All Rights Reserved.
|
||||||
|
%%
|
||||||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
%% you may not use this file except in compliance with the License.
|
||||||
|
%% You may obtain a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing, software
|
||||||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
%% See the License for the specific language governing permissions and
|
||||||
|
%% limitations under the License.
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%%
|
||||||
|
-module(emqx_gateway_api_authn).
|
||||||
|
|
||||||
|
-behaviour(minirest_api).
|
||||||
|
|
||||||
|
%% minirest behaviour callbacks
|
||||||
|
-export([api_spec/0]).
|
||||||
|
|
||||||
|
api_spec() ->
|
||||||
|
{[], []}.
|
|
@ -0,0 +1,25 @@
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% Copyright (c) 2021 EMQ Technologies Co., Ltd. All Rights Reserved.
|
||||||
|
%%
|
||||||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
%% you may not use this file except in compliance with the License.
|
||||||
|
%% You may obtain a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing, software
|
||||||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
%% See the License for the specific language governing permissions and
|
||||||
|
%% limitations under the License.
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%%
|
||||||
|
-module(emqx_gateway_api_client).
|
||||||
|
|
||||||
|
-behaviour(minirest_api).
|
||||||
|
|
||||||
|
%% minirest behaviour callbacks
|
||||||
|
-export([api_spec/0]).
|
||||||
|
|
||||||
|
api_spec() ->
|
||||||
|
{[], []}.
|
Loading…
Reference in New Issue