176 lines
8.1 KiB
Erlang
176 lines
8.1 KiB
Erlang
%%%-------------------------------------------------------------------
|
|
%%% @author licheng5
|
|
%%% @copyright (C) 2020, <COMPANY>
|
|
%%% @doc
|
|
%%%
|
|
%%% @end
|
|
%%% Created : 26. 4月 2020 3:36 下午
|
|
%%%-------------------------------------------------------------------
|
|
-module(service_handler).
|
|
-author("licheng5").
|
|
-include("iot.hrl").
|
|
|
|
%% API
|
|
-export([handle_request/4]).
|
|
|
|
%% 下发config.json, 微服务接受后,保存服务配置
|
|
handle_request("POST", "/service/push_config", _,
|
|
#{<<"uuid">> := UUID, <<"service_id">> := ServiceId, <<"last_edit_user">> := LastEditUser, <<"config_json">> := ConfigJson, <<"timeout">> := Timeout0})
|
|
when is_binary(UUID), is_binary(ServiceId), is_binary(ConfigJson), is_integer(Timeout0) ->
|
|
|
|
%% 检查ConfigJson是否是合法的json字符串
|
|
case iot_util:is_json(ConfigJson) of
|
|
true ->
|
|
case iot_host:get_pid(UUID) of
|
|
undefined ->
|
|
{ok, 200, iot_util:json_error(-1, <<"host not found">>)};
|
|
Pid when is_pid(Pid) ->
|
|
Timeout = Timeout0 * 1000,
|
|
case iot_host:async_service_config(Pid, ServiceId, ConfigJson, Timeout) of
|
|
{ok, Ref} ->
|
|
case iot_host:await_reply(Ref, Timeout) of
|
|
{ok, Result} ->
|
|
%% 更新配置信息到数据库
|
|
case service_config_model:update(ServiceId, UUID, ConfigJson, LastEditUser) of
|
|
ok ->
|
|
{ok, 200, iot_util:json_data(Result)};
|
|
{error, Reason} ->
|
|
lager:debug("[service_handler] set_config service_id: ~p, get error: ~p", [ServiceId, Reason]),
|
|
{ok, 200, iot_util:json_error(-1, <<"set service config failed">>)}
|
|
end;
|
|
{error, Reason} ->
|
|
{ok, 200, iot_util:json_error(-1, Reason)}
|
|
end;
|
|
{error, Reason} when is_binary(Reason) ->
|
|
{ok, 200, iot_util:json_error(-1, Reason)}
|
|
end
|
|
end;
|
|
false ->
|
|
{ok, 200, iot_util:json_error(-1, <<"config is invalid json">>)}
|
|
end;
|
|
|
|
%% 获取服务配置信息
|
|
handle_request("GET", "/service/get_config", #{<<"service_id">> := ServiceId}, _) when is_binary(ServiceId) ->
|
|
case service_config_model:get_config(ServiceId) of
|
|
error ->
|
|
{ok, 200, iot_util:json_error(-1, <<"service config not found">>)};
|
|
{ok, Config} ->
|
|
{ok, 200, iot_util:json_data(service_config_model:as_map(Config))}
|
|
end;
|
|
|
|
%% 删除对应的主机信息
|
|
handle_request("POST", "/service/delete_config", _, #{<<"service_id">> := ServiceId}) when is_binary(ServiceId) ->
|
|
case service_config_model:delete(ServiceId) of
|
|
ok ->
|
|
{ok, 200, iot_util:json_data(<<"success">>)};
|
|
{error, Reason} ->
|
|
lager:debug("[service_handler] delete config of service_id: ~p, error: ~p", [ServiceId, Reason]),
|
|
{ok, 200, iot_util:json_error(-1, <<"delete service config errror">>)}
|
|
end;
|
|
|
|
%% 部署微服务
|
|
handle_request("POST", "/service/deploy", _, #{<<"uuid">> := UUID, <<"task_id">> := TaskId, <<"service_id">> := ServiceId, <<"tar_url">> := TarUrl})
|
|
when is_binary(UUID), is_integer(TaskId), is_binary(ServiceId), is_binary(TarUrl) ->
|
|
|
|
case iot_host:get_pid(UUID) of
|
|
undefined ->
|
|
{ok, 200, iot_util:json_error(404, <<"host not found">>)};
|
|
Pid when is_pid(Pid) ->
|
|
case iot_host:deploy_service(Pid, TaskId, ServiceId, TarUrl) of
|
|
{ok, Ref} ->
|
|
case iot_host:await_reply(Ref, 5000) of
|
|
{ok, Result} ->
|
|
{ok, 200, iot_util:json_data(Result)};
|
|
{error, Reason} ->
|
|
{ok, 200, iot_util:json_error(400, Reason)}
|
|
end;
|
|
{error, Reason} when is_binary(Reason) ->
|
|
{ok, 200, iot_util:json_error(400, Reason)}
|
|
end
|
|
end;
|
|
|
|
%% 启动服务
|
|
handle_request("POST", "/service/start", _, #{<<"uuid">> := UUID, <<"service_id">> := ServiceId}) when is_binary(UUID), is_binary(ServiceId) ->
|
|
case iot_host:get_pid(UUID) of
|
|
undefined ->
|
|
{ok, 200, iot_util:json_error(404, <<"host not found">>)};
|
|
Pid when is_pid(Pid) ->
|
|
case iot_host:start_service(Pid, ServiceId) of
|
|
{ok, Ref} ->
|
|
case iot_host:await_reply(Ref, 5000) of
|
|
{ok, Result} ->
|
|
{ok, 200, iot_util:json_data(Result)};
|
|
{error, Reason} ->
|
|
{ok, 200, iot_util:json_error(400, Reason)}
|
|
end;
|
|
{error, Reason} when is_binary(Reason) ->
|
|
{ok, 200, iot_util:json_error(400, Reason)}
|
|
end
|
|
end;
|
|
|
|
%% 停止服务
|
|
handle_request("POST", "/service/stop", _, #{<<"uuid">> := UUID, <<"service_id">> := ServiceId}) when is_binary(UUID), is_binary(ServiceId) ->
|
|
case iot_host:get_pid(UUID) of
|
|
undefined ->
|
|
{ok, 200, iot_util:json_error(404, <<"host not found">>)};
|
|
Pid when is_pid(Pid) ->
|
|
case iot_host:stop_service(Pid, ServiceId) of
|
|
{ok, Ref} ->
|
|
case iot_host:await_reply(Ref, 5000) of
|
|
{ok, Result} ->
|
|
{ok, 200, iot_util:json_data(Result)};
|
|
{error, Reason} ->
|
|
{ok, 200, iot_util:json_error(400, Reason)}
|
|
end;
|
|
{error, Reason} when is_binary(Reason) ->
|
|
{ok, 200, iot_util:json_error(400, Reason)}
|
|
end
|
|
end;
|
|
|
|
%% 远程调用微服务, 返回值的格式为json
|
|
handle_request("POST", "/service/invoke", _, #{<<"uuid">> := UUID, <<"service_id">> := ServiceId, <<"payload">> := Payload, <<"timeout">> := Timeout0})
|
|
when is_binary(UUID), is_binary(ServiceId), is_binary(Payload), is_integer(Timeout0) ->
|
|
|
|
case iot_host:get_pid(UUID) of
|
|
undefined ->
|
|
{ok, 200, iot_util:json_error(404, <<"host not found">>)};
|
|
Pid when is_pid(Pid) ->
|
|
Timeout = Timeout0 * 1000,
|
|
case iot_host:invoke_service(Pid, ServiceId, Payload, Timeout) of
|
|
{ok, Ref} ->
|
|
case iot_host:await_reply(Ref, Timeout) of
|
|
{ok, Result} ->
|
|
{ok, 200, iot_util:json_data(Result)};
|
|
{error, Reason} ->
|
|
{ok, 200, iot_util:json_error(400, Reason)}
|
|
end;
|
|
{error, Reason} when is_binary(Reason) ->
|
|
{ok, 200, iot_util:json_error(400, Reason)}
|
|
end
|
|
end;
|
|
|
|
handle_request("POST", "/service/task_log", _, #{<<"uuid">> := UUID, <<"task_id">> := TaskId}) when is_binary(UUID), is_integer(TaskId) ->
|
|
case iot_host:get_pid(UUID) of
|
|
undefined ->
|
|
{ok, 200, iot_util:json_error(404, <<"host not found">>)};
|
|
Pid when is_pid(Pid) ->
|
|
case iot_host:task_log(Pid, TaskId) of
|
|
{ok, Ref} ->
|
|
case iot_host:await_reply(Ref, 5000) of
|
|
{ok, Result} ->
|
|
{ok, 200, iot_util:json_data(Result)};
|
|
{error, Reason} ->
|
|
{ok, 200, iot_util:json_error(400, Reason)}
|
|
end;
|
|
{error, Reason} when is_binary(Reason) ->
|
|
{ok, 200, iot_util:json_error(400, Reason)}
|
|
end
|
|
end;
|
|
|
|
handle_request(_, Path, _, _) ->
|
|
Path1 = list_to_binary(Path),
|
|
{ok, 200, iot_util:json_error(-1, <<"url: ", Path1/binary, " not found">>)}.
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%% helper methods
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |