fix model

This commit is contained in:
anlicheng 2023-02-27 00:53:03 +08:00
parent 35041b9708
commit 61275a4183
7 changed files with 200 additions and 76 deletions

View File

@ -46,10 +46,12 @@
-record(interface_metric, {
%%
name = <<>>,
%%
%%
desc = <<>>,
%% , json
detail = <<>>,
%%
status
status = 0
}).
%%
@ -63,7 +65,7 @@
%% , : av
unit :: any(),
%% , 100, : [{ts, value}]
queue = [] :: queus:queue(),
queue = queue:new() :: queus:queue(),
%%
update_ts = 0 :: integer()
}).
@ -116,14 +118,13 @@
%%
access_protocol :: binary(),
%% ID
product_id :: integer(),
product_id = 0 :: integer(),
%% ID
vendor_id :: integer(),
vendor_id = 0 :: integer(),
%%
model :: binary(),
model = <<>> :: binary(),
%% ID
cell_id :: integer(),
cell_id = 0 :: integer(),
%%
status = 0 :: integer(),
%% 线

View File

@ -36,27 +36,25 @@ handle_request(_, "/host/list", Params, PostParams) ->
0
end,
%%
Filter = fun(#host{model = Model0, cell_id = CellId0}) ->
lists:all(fun(E) ->
case E of
{model, M} ->
lager:debug("m: ~p, mid: ~p", [M, Model0]),
case M =/= <<"">> of
true -> M =:= Model0;
_ -> true
end;
{cell_id, C} ->
lager:debug("c: ~p, cid: ~p", [C, CellId0]),
case C > 0 of
true -> C == CellId0;
_ -> true
end
end
end, [{model, Model}, {cell_id, CellId1}])
MatchHead = #host{model = '$1', cell_id = '$2', _ = '_'},
Guard = [],
Guard1 = case Model =/= <<"">> of
true ->
[{'=:=', '$1', Model}|Guard];
false ->
Guard
end,
case host_model:get_hosts(Filter, Start, Size) of
Guard2 = case CellId1 > 0 of
true ->
[{'=:=', '$2', CellId1}|Guard1];
false ->
Guard1
end,
Result = ['$_'],
case host_model:get_hosts({MatchHead, Guard2, Result}, Start, Size) of
{ok, Hosts, TotalNum} ->
Response = #{
<<"hosts">> => lists:map(fun(Host) -> host_model:to_map(Host) end, Hosts),
@ -71,6 +69,26 @@ handle_request(_, "/host/list", Params, PostParams) ->
lager:warning("[host_handler] get a error: ~p", [Reason]),
{ok, 200, iot_util:json_error(404, <<"database error">>)}
end;
handle_request("GET", "/host/detail", #{<<"id">> := HostId}, _) ->
lager:debug("[host_handler] detail id is: ~p", [HostId]),
case host_model:get_host(HostId) of
undefined ->
{ok, 200, iot_util:json_error(404, <<"host not found">>)};
{ok, Host} ->
HostInfo = host_model:to_map(Host),
%%
{ok, Terminals0} = terminal_model:get_host_terminals(HostId),
Terminals = lists:map(fun(E) -> terminal_model:to_map(E) end, Terminals0),
HostInfo1 = maps:put(<<"terminals">>, Terminals, HostInfo),
%%
{ok, Services0} = service_model:get_host_services(HostId),
Services = lists:map(fun(S) -> service_model:to_map(S) end, Services0),
HostInfo2 = maps:put(<<"services">>, Services, HostInfo1),
{ok, 200, iot_util:json_data(HostInfo2)}
end;
handle_request("POST", "/host/update", _, _Params) ->
lager:debug("[host_handler] post params is: ~p", [_Params]),

View File

@ -81,7 +81,7 @@ handle(<<"server.register">>, Msg = #{<<"c_id">> := ClientId, <<"r">> := PubKey,
handle(<<"server.data">>, #{<<"c_id">> := HostId, <<"d">> := Data}) ->
case host_model:get_host(HostId) of
{ok, #host{aes = Aes}} ->
Services = microservice_model:get_services(HostId),
Services = service_model:get_services(HostId),
PlainData = iot_cipher_aes:decrypt(Aes, Aes, Data),
case jiffy:decode(PlainData, [return_maps]) of
Infos when is_list(Infos) ->

View File

@ -11,7 +11,7 @@
-include("iot.hrl").
%% API
-export([insert_hosts/0]).
-export([insert_hosts/0, insert_services/1, insert_terminals/1]).
-export([rsa_encode/1]).
insert_hosts() ->
@ -27,6 +27,50 @@ insert_hosts() ->
host_model:add_host(Host)
end, lists:seq(1, 100)).
insert_services(HostId) ->
lists:foreach(fun(Id0) ->
Q0 = queue:new(),
Q = queue:in({1234, 21}, Q0),
Service = #service{
service_id = integer_to_binary(Id0),
host_id = HostId,
name = <<"Service_0001">>,
category = <<"电器"/utf8>>,
%%
apply_object = <<"暂时不清楚"/utf8>>,
%%
version = <<"v1.1">>,
%%
execute_count = 10,
%%
deploy_ts = 0,
metrics = [#service_metric{symbol = <<"X10">>, name = <<"温度"/utf8>>, last_value = 10, unit = <<"E">>, queue = Q}],
status = 0
},
service_model:add_service(Service)
end, lists:seq(1, 100)).
insert_terminals(HostId) ->
lists:foreach(fun(Id0) ->
Q0 = queue:new(),
Q = queue:in({1234, 21}, Q0),
Terminal = #terminal{
terminal_id = integer_to_binary(Id0),
host_id = HostId,
name = <<"Service_0001">>,
code = <<"1234">>,
access_protocol = <<"TCP/IP">>,
product_id = 12,
vendor_id = 13,
model = <<"1345">>,
cell_id = 12,
status = 0
},
terminal_model:add_terminal(Terminal)
end, lists:seq(1, 100)).
rsa_encode(Data) when is_binary(Data) ->
%%

View File

@ -24,26 +24,14 @@ get_host(HostId) when is_binary(HostId) ->
end.
%% app信息
-spec get_hosts(Filter :: fun(), Start :: integer(), Limit :: integer()) ->
-spec get_hosts(Filter :: any(), Start :: integer(), Limit :: integer()) ->
{ok, Items :: list(), TotalNum :: integer()} |
{error, Reason :: any()}.
get_hosts(Filter, Start, Limit) when is_function(Filter, 1), is_integer(Limit), is_integer(Start), Start >= 0, Limit > 0 ->
Fun = fun() ->
mnesia:foldl(fun(Host, Acc) ->
case Filter(Host) of
true -> [Host|Acc];
false -> Acc
end
end, [], host)
end,
case mnesia:transaction(Fun) of
{atomic, Items0} when is_list(Items0) ->
get_hosts(Spec, Start, Limit) when is_integer(Limit), is_integer(Start), Start >= 0, Limit > 0 ->
Items0 = mnesia:dirty_select(host, [Spec]),
Items = lists:reverse(Items0),
NItems = lists:sublist(Items, Start + 1, Limit),
{ok, NItems, length(Items)};
{aborted, Error} ->
Error
end.
{ok, NItems, length(Items)}.
%%
get_stat() ->
@ -126,9 +114,13 @@ table_size() ->
%% helper methods
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
to_map(#host{host_id = HostId, name = Name, model = Model, cell_id = CellId, activated_ts = ActivatedTs,
update_ts = UpdateTs, status = Status}) ->
to_map(#host{host_id = HostId, name = Name, model = Model, cell_id = CellId, activated_ts = ActivatedTs, update_ts = UpdateTs, status = Status,
metric = #host_metric{
cpus = Cpus,
cpu_temperature = CpuTemperature,
memory = #memory_metric{used = MemoryUsed, total = MemoryTotal},
disk = #disk_metric{used = DiskUsed, total = DiskTotal},
interfaces = Interfaces}}) ->
#{
<<"host_id">> => HostId,
<<"name">> => Name,
@ -136,5 +128,28 @@ to_map(#host{host_id = HostId, name = Name, model = Model, cell_id = CellId, act
<<"cell_id">> => CellId,
<<"activated_ts">> => ActivatedTs,
<<"update_ts">> => UpdateTs,
<<"status">> => Status
<<"status">> => Status,
<<"metric">> => #{
<<"cpus">> => lists:map(fun(#cpu_metric{num = Num, load = Load}) ->
#{<<"num">> => Num, <<"load">> => Load }
end,
Cpus),
<<"cpu_temperature">> => CpuTemperature,
<<"memory">> => #{
<<"used">> => MemoryUsed,
<<"total">> => MemoryTotal
},
<<"disk">> => #{
<<"used">> => DiskUsed,
<<"total">> => DiskTotal
},
<<"interfaces">> => lists:map(fun(#interface_metric{name = IName, desc = IDesc, status = IStatus, detail = IDetail}) ->
#{
<<"name">> => IName,
<<"desc">> => IDesc,
<<"status">> => IStatus,
<<"detatil">> => IDetail
}
end, Interfaces)
}
}.

View File

@ -12,8 +12,8 @@
-include_lib("stdlib/include/qlc.hrl").
%% API
-export([get_services/1, get_service/2, add_service/1, change_status/2, delete/1, table_size/0]).
-export([update_metric/2]).
-export([get_host_services/1, get_service/2, add_service/1, change_status/2, delete/1, table_size/0]).
-export([update_metric/2, to_map/1]).
get_service(HostId, ServiceName) when is_binary(HostId), is_binary(ServiceName) ->
Fun = fun() ->
@ -27,16 +27,16 @@ get_service(HostId, ServiceName) when is_binary(HostId), is_binary(ServiceName)
undefined
end.
get_services(HostId) when is_binary(HostId) ->
get_host_services(HostId) when is_binary(HostId) ->
Fun = fun() ->
Q = qlc:q([E || E <- mnesia:table(service), E#service.host_id =:= HostId]),
qlc:e(Q)
end,
case mnesia:transaction(Fun) of
Services when is_list(Services) ->
Services;
_ ->
[]
{atomic, Services} when is_list(Services) ->
{ok, Services};
{aborted, Error} ->
{error, Error}
end.
add_service(Service = #service{}) ->
@ -95,6 +95,34 @@ delete(ServiceId) when is_binary(ServiceId) ->
table_size() ->
mnesia:table_info(service, size).
to_map(#service{service_id = ServiceId, host_id = HostId, name = Name, category = Category, apply_object = ApplyObject,
version = Version, execute_count = ExecuteCount, deploy_ts = DeployTs, metrics = Metrics, status = Status}) ->
Metrics1 = lists:map(fun(#service_metric{symbol = MetricSymbol, name = MetricName, last_value = LastValue, unit = Unit, queue = Queue, update_ts = UpdateTs}) ->
Q = lists:map(fun({Ts, Val}) -> #{<<"time">> => Ts, <<"value">> => Val} end, queue:to_list(Queue)),
#{
<<"symbol">> => MetricSymbol,
<<"name">> => MetricName,
<<"last_value">> => LastValue,
<<"queue">> => Q,
<<"unit">> => Unit,
<<"update_ts">> => UpdateTs
}
end, Metrics),
#{
<<"service_id">> => ServiceId,
<<"host_id">> => HostId,
<<"name">> => Name,
<<"category">> => Category,
<<"apply_object">> => ApplyObject,
<<"version">> => Version,
<<"execute_count">> => ExecuteCount,
<<"deploy_ts">> => DeployTs,
<<"metrics">> => Metrics1,
<<"status">> => Status
}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% helper methods
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View File

@ -12,8 +12,8 @@
-include_lib("stdlib/include/qlc.hrl").
%% API
-export([get_all_terminals/0, get_status_stat/0]).
-export([change_status/2, delete/1]).
-export([get_all_terminals/0, get_host_terminals/1, get_status_stat/0, table_size/0]).
-export([change_status/2, delete/1, to_map/1, add_terminal/1]).
%% app信息
get_all_terminals() ->
@ -22,10 +22,22 @@ get_all_terminals() ->
qlc:e(Q)
end,
case mnesia:transaction(Fun) of
Items when is_list(Items) ->
{atomic, Items} when is_list(Items) ->
{ok, Items};
{error, _, Reason} ->
{error, Reason}
{aborted, Error} ->
{error, Error}
end.
get_host_terminals(HostId) when is_binary(HostId) ->
Fun = fun() ->
Q = qlc:q([E || E <- mnesia:table(terminal), E#terminal.host_id =:= HostId]),
qlc:e(Q)
end,
case mnesia:transaction(Fun) of
{atomic, Items} when is_list(Items) ->
{ok, Items};
{aborted, Error} ->
{error, Error}
end.
%%
@ -45,19 +57,7 @@ get_status_stat() ->
{error, Reason}
end.
insert(Id, HostId, Name, ProductId, VendorId, Model, CellId) ->
Terminal = #terminal{
terminal_id = Id,
name = Name,
product_id = ProductId,
vendor_id = VendorId,
model = Model,
cell_id = CellId,
host_id = HostId,
update_ts = 0,
status = ?HOST_STATUS_INACTIVE
},
add_terminal(Terminal = #terminal{}) ->
case mnesia:transaction(fun() -> mnesia:write(terminal, Terminal, write) end) of
{atomic, _} ->
ok;
@ -94,6 +94,24 @@ delete(TerminalId) when is_binary(TerminalId) ->
table_size() ->
mnesia:table_info(host, size).
to_map(#terminal{terminal_id = TerminalId, host_id = HostId, name = Name, code = Code, access_protocol = AccessProtocol,
product_id = ProductId, vendor_id = VendorId, model = Model, cell_id = CellId, status = Status, update_ts = UpdateTs}) ->
#{
<<"terminal_id">> => TerminalId,
<<"host_id">> => HostId,
<<"name">> => Name,
<<"code">> => Code,
<<"access_protocol">> => AccessProtocol,
<<"product_id">> => ProductId,
<<"vendor_id">> => VendorId,
<<"model">> => Model,
<<"cell_id">> => CellId,
<<"status">> => Status,
<<"update_ts">> => UpdateTs
}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% helper methods
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%